[ { "description": "patternProperties validates properties matching a regex", "schema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "patternProperties": { "f.*o": { "type": "integer" } }, "items": {} }, "tests": [ { "description": "a single valid match is valid", "data": { "foo": 1 }, "valid": true }, { "description": "multiple valid matches is valid", "data": { "foo": 1, "foooooo": 2 }, "valid": true }, { "description": "a single invalid match is invalid", "data": { "foo": "bar", "fooooo": 2 }, "valid": false }, { "description": "multiple invalid matches is invalid", "data": { "foo": "bar", "foooooo": "baz" }, "valid": false }, { "description": "ignores arrays", "data": [ "foo" ], "valid": true }, { "description": "ignores strings", "data": "foo", "valid": true }, { "description": "ignores other non-objects", "data": 12, "valid": true }, { "description": "extra property not matching pattern is INVALID (strict by default)", "data": { "foo": 1, "extra": 2 }, "valid": false } ] }, { "description": "multiple simultaneous patternProperties are validated", "schema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "patternProperties": { "a*": { "type": "integer" }, "aaa*": { "maximum": 20 } } }, "tests": [ { "description": "a single valid match is valid", "data": { "a": 21 }, "valid": true }, { "description": "a simultaneous match is valid", "data": { "aaaa": 18 }, "valid": true }, { "description": "multiple matches is valid", "data": { "a": 21, "aaaa": 18 }, "valid": true }, { "description": "an invalid due to one is invalid", "data": { "a": "bar" }, "valid": false }, { "description": "an invalid due to the other is invalid", "data": { "aaaa": 31 }, "valid": false }, { "description": "an invalid due to both is invalid", "data": { "aaa": "foo", "aaaa": 31 }, "valid": false } ] }, { "description": "regexes are not anchored by default and are case sensitive", "schema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "patternProperties": { "[0-9]{2,}": { "type": "boolean" }, "X_": { "type": "string" } }, "extensible": true }, "tests": [ { "description": "non recognized members are ignored", "data": { "answer 1": "42" }, "valid": true }, { "description": "recognized members are accounted for", "data": { "a31b": null }, "valid": false }, { "description": "regexes are case sensitive", "data": { "a_x_3": 3 }, "valid": true }, { "description": "regexes are case sensitive, 2", "data": { "a_X_3": 3 }, "valid": false } ] }, { "description": "patternProperties with boolean schemas", "schema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "patternProperties": { "f.*": true, "b.*": false } }, "tests": [ { "description": "object with property matching schema true is valid", "data": { "foo": 1 }, "valid": true }, { "description": "object with property matching schema false is invalid", "data": { "bar": 2 }, "valid": false }, { "description": "object with both properties is invalid", "data": { "foo": 1, "bar": 2 }, "valid": false }, { "description": "object with a property matching both true and false is invalid", "data": { "foobar": 1 }, "valid": false }, { "description": "empty object is valid", "data": {}, "valid": true } ] }, { "description": "patternProperties with null valued instance properties", "schema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "patternProperties": { "^.*bar$": { "type": "null" } } }, "tests": [ { "description": "allows null values", "data": { "foobar": null }, "valid": true } ] }, { "description": "extensible: true allows extra properties NOT matching pattern", "schema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "patternProperties": { "f.*o": { "type": "integer" } }, "extensible": true }, "tests": [ { "description": "extra property not matching pattern is valid", "data": { "bar": 1 }, "valid": true }, { "description": "property matching pattern MUST still be valid", "data": { "foo": "invalid string" }, "valid": false } ] } ]