我正在研究JSON架构,我不确定我是否正确设计了这个架构并且会感谢任何建议。
所以我有一个名为“Task.json”的父对象,它引用了一个名为“Data.json”的内部对象。现在我需要一种方法来验证模式,以便“Data.json”的必需属性根据“Task.json”的属性而变化。例如,如果Task.json包含“action = create”,那么我们希望data.json中的属性为“a”,“b”或“c”,而“action = update”应为“a”,“d” ,“e”。我不确定如何在data.json中引用父对象(action),以便能够根据“action”参数指定有效属性。
示例:
Task.json
{
"oneOf":[
{
"action":"create",
"data":"data.json"
},
{
"action":"update",
"data":"data.json"
}
]
}
Data.json
{
"properties":{
"a":{
},
"b":{
},
"d":{
},
"e":{
}
},
"oneOf":[
{
"#/action":{
"enum":[
"create"
]
},
"required":[
"a",
"b",
"c"
]
},
{
"#/action":{
"enum":[
"update"
]
},
"required":[
"a",
"d",
"e"
]
}
]
}
答案 0 :(得分:0)
您使用$ref
关键字引用子架构。你的案子表达起来有点复杂,但绝对可行。根据您的使用案例的细节,有一些方法可以简化。我在这里展示了最灵活的设计。
{
"type": "object",
"properties": {
"action": { "enum": ["create", "update", "delete"] },
"data": {
"type": "object",
"properties": {
"a": {},
"b": {},
"d": {},
"e": {}
}
}
},
"allOf": [
{ "$ref": "#/definitions/action-create-implies-abc" },
{ "$ref": "#/definitions/action-update-implies-ade" }
],
"definitions": {
"action-create-implies-abc": {
"anyOf": [
{ "not": { "$ref": "#/definitions/action-create" } },
{
"properties": {
"data": { "required": ["a", "b", "c"] }
},
"required": ["data"]
}
]
},
"action-update-implies-ade": {
"anyOf": [
{ "not": { "$ref": "#/definitions/action-update" } },
{
"properties": {
"data": { "required": ["a", "d", "e"] }
},
"required": ["data"]
}
]
},
"action-create": {
"properties": {
"action": { "enum": ["create"] }
},
"required": ["action"]
},
"action-update": {
"properties": {
"action": { "enum": ["update"] }
},
"required": ["action"]
}
}
}
答案 1 :(得分:0)
所以我刚添加了另一个图层,其中Data.json中有一个“MetaData.json”,“create”需要“Data.json”和“a”,“b”和“c”。 Metadata.json“而Update只需要”Metadata.json“,并根据需要添加”a“,”d“和”e“。在这种情况下,有没有办法在定义/属性的内部指出data.metadata的必需属性是“a”,“b”和“c”?这种设计遵循“更新”操作可能只需要的用例“metadata.json”将被传递。
示例:
Data.json
{
"properties":{
"x":{
},
"y":{
},
"z":{
},
"metadata": {
$ref: "metadata.json"
}
}
Metadata.json
{
"properties":{
"a":{
},
"b":{
},
"d":{
},
"e":{
}
}