swaggest / php-json-schema

High definition PHP structures with JSON-schema based validation
MIT License
438 stars 50 forks source link

Frustrated to understand the error structure #139

Open videni opened 2 years ago

videni commented 2 years ago

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.

dkd-kaehm commented 2 years ago

@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()
        ]
}