php-json-schema icon indicating copy to clipboard operation
php-json-schema copied to clipboard

Frustrated to understand the error structure

Open videni opened this issue 2 years ago • 1 comments

Here is an error I got when I try to validate

JSON Data

{
    "name": "Slideshow",
    "tag": "section",
    "class": "slideshow",
    "max_blocks": 5,
    "settings": [
        {
            "id": "title",
            "type": "text",
            "label": "Slideshow"
        }
    ],
    "blocks": [
        {
            "name": "Slide",
            "type": "slide",
            "settings": [
                {
                    "type": "image_picker",
                    "id": "image",
                    "label": "Image"
                }
            ]
        }
    ]
}

JSON schema

{
    "$id": "/schemas/section",
    "type": "object",
    "properties": {
        "name": { "type": "string"},
        "tag": { "type": "string"},
        "class": { "type": "string"},
        "blocks": {
            "$ref": "file://block.json"
        },
        "settings": {
            "$ref": "file://settings.json"
        },
        "max_blocks": {
            "type": "integer"
        },
        "presets": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "blocks": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "type": {"type": "string"}
                            }
                        }
                    }
                }
            }
        },
        "default": {
            "type": "object",
            "properties": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "type": {"type": "string"}
                    }
                }
            }
        }
    },
    "required": ["name"]
}

The error I got.

No valid results for anyOf {
  0: No valid results for anyOf {
   0: Array expected, "id" received at #->properties:properties->additionalProperties:blocks->properties:items->anyOf[0]->$ref:file://block.json->properties:properties->additionalProperties:settings->$ref:file://settings.json->properties:items->anyOf[0]->properties:oneOf->items[5]:5->$ref:file://types/image_picker.json->properties:required at #->properties:properties->additionalProperties:blocks->properties:items->anyOf[0]->$ref:file://block.json->properties:properties->additionalProperties:settings->$ref:file://settings.json->properties:items->anyOf[0]->properties:oneOf->items[5]:5
   1: Array expected, {"oneOf":[{"$ref":"file:\/\/types\/checkbox.json"},{"$ref":"file:\/\/types\/collection.json"},{"$ref":"file:\/\/types\/color_picker.json"},{"$ref":"file:\/\/types\/color.json"},{"$ref":"file:\/\/types\/header.json"},{"$ref":"file:\/\/types\/image_picker.json"},{"$ref":"file:\/\/types\/link_list.json"},{"$ref":"file:\/\/types\/product.json"},{"$ref":"file:\/\/types\/radio.json"},{"$ref":"file:\/\/types\/range.json"},{"$ref":"file:\/\/types\/richtext.json"},{"$ref":"file:\/\/types\/select.json"},{"$ref":"file:\/\/types\/text.json"},{"$ref":"file:\/\/types\/textarea.json"},{"$ref":"file:\/\/types\/url.json"},{"$ref":"file:\/\/types\/video_url.json"},{"$ref":"file:\/\/types\/video.json"}]} received at #->properties:properties->additionalProperties:blocks->properties:items->anyOf[0]->$ref:file://block.json->properties:properties->additionalProperties:settings->$ref:file://settings.json->properties:items->anyOf[1]
 } at #->properties:properties->additionalProperties:blocks->properties:items->anyOf[0]->$ref:file://block.json->properties:properties->additionalProperties:settings->$ref:file://settings.json->properties:items at #->properties:properties->additionalProperties:blocks->properties:items->anyOf[0]->$ref:file://block.json->properties:properties->additionalProperties:settings at #->properties:properties->additionalProperties:blocks->properties:items->anyOf[0]
  1: Array expected, {"$ref":"file:\/\/block.json"} received at #->properties:properties->additionalProperties:blocks->properties:items->anyOf[1]
} at #->properties:properties->additionalProperties:blocks->properties:items

Can we bind the error to the JSON data instead of the JSON schema. I need to present the which property is missing, or invalid, our customer will be insane if we show the error above. Even me , unable to figure out what the JSON data is wrong from the error above. please let me know if this is possible please at the moment.

videni avatar Jan 05 '22 08:01 videni

@videni may be $exception->getDataPointer() helps there?

try {
    $result = $schema->in(json_decode(file_get_contents($dataFile)));
} catch (InvalidValue $e) {
    return [
            "dataPointer" => $e->getDataPointer(),
            "schemaPointer" => $e->getSchemaPointer(),
            "Message" => $e->getMessage()
        ]
}

dkd-kaehm avatar Jan 27 '22 11:01 dkd-kaehm