【发布时间】:2013-11-10 15:31:49
【问题描述】:
大家好,提前致谢。
我正在尝试创建一个 JSON 模式来强制数组包含一个 A 和 B 对象以及 N 个 C 对象,其中 A 和 B 是 C 对象,N 是介于 0 和无穷大之间的整数。
为此:
[A, B]
[A, B, C1]
[A, B, C1, .., CN]
虽然都是有效:
[A]
[A, C1]
[A, C1, .., CN]
无效。
为了清楚起见,A 和 B 必须在场。 C 对象是可选的,尽管您可以拥有任意数量的对象。
C 对象模式:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "C Object",
"type": "object",
"required": ["id", "name"],
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
因此,C 对象是任何仅包含属性“id”和“name”的有效 JSON 对象,其中“id”是整数,“name”是字符串。
A 和 B 对象模式:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "A Object",
"type": "object",
"required": ["id", "name"],
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string",
"enum": ["A"]
}
},
"additionalProperties": false
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "B Object",
"type": "object",
"required": ["id", "name"],
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string",
"enum": ["B"]
}
},
"additionalProperties": false
}
A 和 B 对象与 C 对象的不同之处在于强制执行名称值。 A 对象的名称值必须是字段 enum 中包含的值,其中 enum 包含单个值。
我迄今为止最完整的架构是:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "To Date Solution",
"description": "So far this is the most complete attempt at enforcing values to be contained within a JSON structure using JSON schemas.",
"type": "array"
"items": {
"allOf": [
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "C Object",
"type": "object",
"required": ["id", "name"],
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
]
}
}
这强制其中包含的所有对象都必须是 C 类型,A 和 B 是,尽管我不确定如何强制至少 A 和 B 的单个实例包含在我的数组中。
【问题讨论】:
-
A和B必须是前两个(按此顺序)吗?或者它们可以出现在列表中的任何位置?
标签: arrays json validation schema jsonschema