我有这个json架构,它有一个包含多个对象的数组,每个对象与其他对象的区别在于某些模式。
实施例
[
{
"ID": "pgID",
"Name": "John",
"Surname": "Doe",
"ProjectsInvolved": [
"My Project",
"My Project 2"
]
},
{
"ID": "jtID",
"Name": "John",
"Surname": "Doe",
"WorksOn": [
"Monday",
"Thursday"
]
}
]
json架构将是:
{
"$schema": "http://json-schema.org/draft-04/schema",
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"ID": {
"type": "string",
"pattern": "^(pg)\\w*$"
},
"Name": {
"type": "string"
},
"Surname": {
"type": "string"
},
"ProjectsInvolved": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
{
"type": "object",
"properties": {
"ID": {
"type": "string",
"pattern": "^(jt)\\w*$"
},
"Name": {
"type": "string"
},
"Surname": {
"type": "string"
},
"WorksOn": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
]
},
"additionalProperties": false
}
我的问题是,尽管真正的json是相似的,但它还有更多的项目,并且随着时间的推移它会变得更大。因此,我必须要问,架构是否可以将相同的元素Name和Surname分组,并且只有oneOf中的ID和数组?
建议架构的示例:
{
"$schema": "http://json-schema.org/draft-04/schema",
"type": "array",
"items": {
"type": "object",
"properties": {
"Name": {
"type": "string"
},
"Surname": {
"type": "string"
},
"oneOf": [
{
"ID": {
"type": "string",
"pattern": "^(pg)\\w*$"
},
"ProjectsInvolved": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"ID": {
"type": "string",
"pattern": "^(jt)\\w*$"
},
"WorksOn": {
"type": "array",
"items": {
"type": "string"
}
}
}
]
}
},
"additionalProperties": false
}
答案 0 :(得分:1)
通常,您希望事先定义常见内容和之后的特殊条件。这使得架构更易于阅读并产生更好的错误消息。
在这个例子中,如果" ProjectsInvolved"存在,然后" ID"必须以" pg"开始和" WorksOn"不能出席。并且,如果" WorksOn"存在,然后" ID"必须从" jt"开始和" ProjectsInvolved"不能出席。
也可以使用oneOf
或anyOf
这样的内容,但您通常会使用dependencies
获得更好的错误消息。
{
"$schema": "http://json-schema.org/draft-04/schema",
"type": "array",
"items": {
"type": "object",
"properties": {
"ID": { "type": "string" },
"Name": { "type": "string" },
"Surname": { "type": "string" },
"ProjectsInvolved": {
"type": "array",
"items": { "type": "string" }
},
"WorksOn": {
"type": "array",
"items": { "type": "string" }
}
},
"dependencies": {
"ProjectsInvolved": {
"properties": {
"ID": { "pattern": "^(pg)\\w*$" }
},
"not": { "required": ["WorksOn"] }
},
"WorksOn": {
"properties": {
"ID": { "pattern": "^(jt)\\w*$" }
},
"not": { "required": ["ProjectsInvolved"] }
}
}
},
"additionalProperties": false
}