jsonrainbow / json-schema

PHP implementation of JSON schema. Fork of the http://jsonschemaphpv.sourceforge.net/ project
MIT License
3.55k stars 355 forks source link

bug: anyOf / oneOf with objects and default values #711

Open kroc702 opened 9 months ago

kroc702 commented 9 months ago

Hello, When mixing several objects with anyOf or oneOf, default values may be wrongly applied and interfere the validation. Cf attached file for a simple use case that where used. testSchemaValidator.zip

Here a first output example:

input value: {
    "b": 2
}
schema: {
    "anyOf": [
        {
            "required": [
                "a"
            ],
            "properties": {
                "a": {
                    "type": "integer"
                },
                "aDefault": {
                    "type": "integer",
                    "default": 1
                }
            },
            "type": "object",
            "additionalProperties": false
        },
        {
            "required": [
                "b"
            ],
            "properties": {
                "b": {
                    "type": "integer"
                },
                "bDefault": {
                    "type": "integer",
                    "default": 2
                }
            },
            "type": "object",
            "additionalProperties": false
        }
    ]
}
/aThe property a is required
The property b is not defined and the definition does not allow additional properties
The property aDefault is not defined and the definition does not allow additional properties
Failed to match at least one schema
output value: {
    "b": 2,
    "aDefault": 1,
    "bDefault": 2
}

result should be valid and { "b": 2, "bDefault": 2}

kroc702 commented 9 months ago

Note that order is important: if input value is 'a', it's working as expected

input value: {
    "a": 1
}
schema: {
    "anyOf": [... same as above ... ]
}
value is valid
output value: {
    "a": 1,
    "aDefault": 1
}
kroc702 commented 9 months ago

With oneOf

input value: {
    "a": 1
}
schema: {
    "oneOf": [... same as above ... ]
}
value is valid
output value: {
    "a": 1,
    "aDefault": 1,
    "bDefault": 2
}

valid but "bDefault" shouldn't be populated.

kroc702 commented 9 months ago

With oneOf, different order

input value: {
    "b": 2
}
schema: {
    "oneOf": [... same as above ...]
}
The property aDefault is not defined and the definition does not allow additional properties
/aThe property a is required
The property b is not defined and the definition does not allow additional properties
Failed to match exactly one schema
output value: {
    "b": 2,
    "aDefault": 1,
    "bDefault": 2
}

result should be valid and { "b": 2, "bDefault": 2}

DannyvdSluijs commented 9 months ago

@kroc702 thanks for the extensive information. I’ll see what I can find from te above or did you already did some debugging and perhaps and close to a PR?

One question I still have is which version of this library are you using? As that would be very informative in the context of this bug.

kroc702 commented 9 months ago

I forget to mention version:

            "name": "justinrainbow/json-schema",
            "version": "v5.2.13",
            "source": {
                "type": "git",
                "url": "https://github.com/justinrainbow/json-schema.git",
                "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793"
            },

And no I didn't debug this code yet. I'll add info here if I take the time to do it.