-- object properties validation -- both properties present and valid is valid SELECT is_jsonb_valid('{"properties":{"foo":{"type":"integer"},"bar":{"type":"string"}}}', '{"foo":1,"bar":"baz"}'); is_jsonb_valid ---------------- t (1 row) -- one property invalid is invalid SELECT is_jsonb_valid('{"properties":{"foo":{"type":"integer"},"bar":{"type":"string"}}}', '{"foo":1,"bar":{}}'); is_jsonb_valid ---------------- f (1 row) -- both properties invalid is invalid SELECT is_jsonb_valid('{"properties":{"foo":{"type":"integer"},"bar":{"type":"string"}}}', '{"foo":[],"bar":{}}'); is_jsonb_valid ---------------- f (1 row) -- doesn't invalidate other properties SELECT is_jsonb_valid('{"properties":{"foo":{"type":"integer"},"bar":{"type":"string"}}}', '{"quux":[]}'); is_jsonb_valid ---------------- t (1 row) -- ignores arrays SELECT is_jsonb_valid('{"properties":{"foo":{"type":"integer"},"bar":{"type":"string"}}}', '[]'); is_jsonb_valid ---------------- t (1 row) -- ignores other non-objects SELECT is_jsonb_valid('{"properties":{"foo":{"type":"integer"},"bar":{"type":"string"}}}', '12'); is_jsonb_valid ---------------- t (1 row) -- properties, patternProperties, additionalProperties interaction -- property validates property SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"foo":[1,2]}'); is_jsonb_valid ---------------- t (1 row) -- property invalidates property SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"foo":[1,2,3,4]}'); is_jsonb_valid ---------------- f (1 row) -- patternProperty invalidates property SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"foo":[]}'); is_jsonb_valid ---------------- f (1 row) -- patternProperty validates nonproperty SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"fxo":[1,2]}'); is_jsonb_valid ---------------- t (1 row) -- patternProperty invalidates nonproperty SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"fxo":[]}'); is_jsonb_valid ---------------- f (1 row) -- additionalProperty ignores property SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"bar":[]}'); is_jsonb_valid ---------------- t (1 row) -- additionalProperty validates others SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"quux":3}'); is_jsonb_valid ---------------- t (1 row) -- additionalProperty invalidates others SELECT is_jsonb_valid('{"properties":{"foo":{"type":"array","maxItems":3},"bar":{"type":"array"}},"patternProperties":{"f.o":{"minItems":2}},"additionalProperties":{"type":"integer"}}', '{"quux":"foo"}'); is_jsonb_valid ---------------- f (1 row)