Hi.
The if-then construct with the combination of allOf does not respect the enums defined in the property value. The properties value as provided in the if construct is alone considered valid.
Considering the example from the conditionals page:
{
"type": "object",
"properties": {
"street_address": {
"type": "string"
},
"country": {
"enum": ["United States of America", "Canada", "Netherlands"]
}
},
"allOf": [
{
"if": {
"properties": { "country": { "const": "United States of America" } }
},
"then": {
"properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
}
},
{
"if": {
"properties": { "country": { "const": "Canada" } }
},
"then": {
"properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
}
},
{
"if": {
"properties": { "country": { "const": "Netherlands" } }
},
"then": {
"properties": { "postal_code": { "pattern": "[0-9]{4} [A-Z]{2}" } }
}
}
]
}
The JsonSchema is constructed as follows:
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7);
SchemaValidatorsConfig config = new SchemaValidatorsConfig();
config.setFailFast(true);
InputStream stream = // read schema
JsonSchema schema = factory.getSchema(stream, config);
If I take the first example
{
"street_address": "1600 Pennsylvania Avenue NW",
"country": "United States of America",
"postal_code": "20500"
}
then I get the following error:
com.networknt.schema.JsonSchemaException: $.country: must be a constant value Canada
at com.networknt.schema.BaseJsonValidator.buildValidationMessage(BaseJsonValidator.java:130)
at com.networknt.schema.ConstValidator.validate(ConstValidator.java:44)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:75)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.IfValidator.validate(IfValidator.java:54)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.AllOfValidator.validate(AllOfValidator.java:44)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.BaseJsonValidator.validate(BaseJsonValidator.java:101)
If I instead use the second example with the country as Canada,
{
"street_address": "24 Sussex Drive",
"country": "Canada",
"postal_code": "K1M 1M4"
}
then I get the error with United States of America:
com.networknt.schema.JsonSchemaException: $.country: must be a constant value United States of America
at com.networknt.schema.BaseJsonValidator.buildValidationMessage(BaseJsonValidator.java:130)
at com.networknt.schema.ConstValidator.validate(ConstValidator.java:44)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:75)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.IfValidator.validate(IfValidator.java:54)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.AllOfValidator.validate(AllOfValidator.java:44)
at com.networknt.schema.JsonSchema.validate(JsonSchema.java:224)
at com.networknt.schema.BaseJsonValidator.validate(BaseJsonValidator.java:101)
Hi.
The
if-thenconstruct with the combination ofallOfdoes not respect theenums defined in the property value. The properties value as provided in theifconstruct is alone considered valid.Considering the example from the conditionals page:
{ "type": "object", "properties": { "street_address": { "type": "string" }, "country": { "enum": ["United States of America", "Canada", "Netherlands"] } }, "allOf": [ { "if": { "properties": { "country": { "const": "United States of America" } } }, "then": { "properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } } } }, { "if": { "properties": { "country": { "const": "Canada" } } }, "then": { "properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } } } }, { "if": { "properties": { "country": { "const": "Netherlands" } } }, "then": { "properties": { "postal_code": { "pattern": "[0-9]{4} [A-Z]{2}" } } } } ] }The
JsonSchemais constructed as follows:If I take the first example
then I get the following error:
If I instead use the second example with the country as
Canada,then I get the error with
United States of America: