Current Situation
The current example JSON Schema for Author is:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "21.T11969/Author Attribute Schema",
"description": "Validates the 21.T11969/Author attribute in an FDO record.",
"type": "array",
"items": {
"type": "object",
"title": "FDO Record Item",
"properties": {
"key": { "type": "string" },
"value": {}
},
"required": ["key", "value"]
},
"oneOf": [
{
"title": "21.T11969_Author - Option 1: Repeated individual objects (1 to 20)",
"contains": {
"properties": {
"key": { "const": "21.T11969/Author" },
"value": { "$ref": "#/$defs/21.T11969_Author_Syntax" }
},
"required": ["key", "value"]
},
"minContains": 1,
"maxContains": 20
},
{
"title": "21.T11969_Author - Option 2: Single list containing 1 to 20 objects",
"contains": {
"properties": {
"key": { "const": "21.T11969/Author" },
"value": {
"type": "array",
"items": { "$ref": "#/$defs/21.T11969_Author_Syntax" },
"minItems": 1,
"maxItems": 20
}
},
"required": ["key", "value"]
},
"minContains": 1,
"maxContains": 1
}
],
"$defs": {
"21.T11969_Author_Syntax": {
"type": "object",
"properties": {
"21.example/first_name": { "type": "string" },
"21.example/last_name": { "type": "string" }
},
"required": ["21.example/last_name"],
"additionalProperties": false
}
}
}
Problem
There is a problem for validation when repeated individual objects are used in the JSON example. Currently, the schema would validate the following example JSON:
[
{
"key": "21.T11969/Author",
"value": {
"21.example/first_name": "Jane",
"21.example/last_name": "Doe"
}
},
{
"key": "21.T11969/Author",
"value": {
"21.example/first_name": "Jon",
"21.example/last_name": 123
}
}
]
But it should not validate this example, because the second item should have a string for the value of 21.example/last_name.
The example wrongly validates because the contains condition is is already fulfilled by the first item. Then, the second (invalid) item would be ignored, leading to successful validation.
Suggested Fix
Combine the contains with an if-else block. The contains checks that the cardinality is correct. The if-else block checks that if the key is 21.T11969/Author, then the value must fulfill the attribute definition of author. A suggested fixed schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "21.T11969/Author Attribute Schema",
"description": "Validates the 21.T11969/Author attribute in an FDO record.",
"type": "array",
"items": {
"type": "object",
"title": "FDO Record Item",
"properties": {
"key": { "type": "string" },
"value": {}
},
"required": ["key", "value"]
},
"oneOf": [
{
"title": "21.T11969_Author - Option 1: Repeated individual objects (1 to 20)",
"contains": {
"properties": {
"key": {
"const": "21.T11969/Author"
}
}
},
"minContains": 1,
"maxContains": 20,
"items": {
"if": {
"properties": {
"key": {
"const": "21.T11969/Author"
}
}
},
"then": {
"properties": {
"value": {
"$ref": "#/$defs/21.T11969~1Author"
}
}
}
}
},
{
"title": "21.T11969_Author - Option 2: Single list containing 1 to 20 objects",
"contains": {
"properties": {
"key": {
"const": "21.T11969/Author"
}
}
},
"minContains": 1,
"maxContains": 1,
"items": {
"if": {
"properties": {
"key": {
"const": "21.T11969/Author"
}
}
},
"then": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/$defs/21.T11969~1Author"
},
"minItems": 1,
"maxItems": 20
}
}
}
}
}
],
"$defs": {
"21.T11969/Author": {
"type": "object",
"properties": {
"21.example/first_name": { "type": "string" },
"21.example/last_name": { "type": "string" }
},
"required": ["21.example/last_name"],
"additionalProperties": false
}
}
}
Note: this bug applies to all example schemas in the folder -> they all may need an update.
Current Situation
The current example JSON Schema for Author is:
Problem
There is a problem for validation when repeated individual objects are used in the JSON example. Currently, the schema would validate the following example JSON:
But it should not validate this example, because the second item should have a string for the value of
21.example/last_name.The example wrongly validates because the
containscondition is is already fulfilled by the first item. Then, the second (invalid) item would be ignored, leading to successful validation.Suggested Fix
Combine the
containswith anif-elseblock. The contains checks that the cardinality is correct. Theif-elseblock checks that if the key is21.T11969/Author, then the value must fulfill the attribute definition of author. A suggested fixed schema:Note: this bug applies to all example schemas in the folder -> they all may need an update.