为两个几乎相同的实例定义一个 JSON 模式
Define one JSON schema for two nearly the same instances
我有 2 个非常相似的 JSON 对象:
{
"a": "a",
"b": "b",
"c": "c",
"attr1": []
}
和
{
"a": "a",
"b": "b",
"c": "c",
"attr2": {}
}
v4 草案是否有可能为这两种情况定义一个架构?
更新: 两个 JSON 实例都不允许附加属性。
谢谢
是的,您将 attr1 设置为空:
data = {
"a": "a",
"b": "b",
"c": "c",
"attr1": null
}
根据您的需要分配列表或对象:
data['attr1'] = [1,2,3]
或 data['attr1'] = {"k1":1, "k2":2}
在处理过程中你可以随时测试
if data['attr1'] is list
do
else if data['attr1'] is object
do
是的,您可以使用 oneOf
关键字来接受 attr1
或 attr2
,或者如果两者都存在,则使用 anyOf
关键字。例如:
{
"type":"object",
"properties" : {
"a" : {
"type" : "string"
},
"b" : {
"type" : "string"
},
"c" : {
"type" : "string"
}
},
"oneOf" : [{
"properties" : {
"attr1" : {
"type" : "array"
}
},
"required":["attr1"]
}, {
"properties" : {
"attr2" : {
"type" : "object"
}
},
"required":["attr2"]
}
]
}
请查看 official docs 以了解所有可能性。
正如@Jason 在评论中所建议的那样,如果您还想禁止其他属性,则只需将 attr1
和 attr2
放在顶层:
{
"type" : "object",
"properties" : {
"a" : {
"type" : "string"
},
"b" : {
"type" : "string"
},
"c" : {
"type" : "string"
},
"attr1" : {
"type" : "array"
},
"attr2" : {
"type" : "object"
}
},
"additionalProperties" : false,
"oneOf" : [{
"required" : ["attr1"]
}, {
"required" : ["attr2"]
}
]
}
我有 2 个非常相似的 JSON 对象:
{
"a": "a",
"b": "b",
"c": "c",
"attr1": []
}
和
{
"a": "a",
"b": "b",
"c": "c",
"attr2": {}
}
v4 草案是否有可能为这两种情况定义一个架构?
更新: 两个 JSON 实例都不允许附加属性。
谢谢
是的,您将 attr1 设置为空:
data = {
"a": "a",
"b": "b",
"c": "c",
"attr1": null
}
根据您的需要分配列表或对象:
data['attr1'] = [1,2,3]
或 data['attr1'] = {"k1":1, "k2":2}
在处理过程中你可以随时测试
if data['attr1'] is list
do
else if data['attr1'] is object
do
是的,您可以使用 oneOf
关键字来接受 attr1
或 attr2
,或者如果两者都存在,则使用 anyOf
关键字。例如:
{
"type":"object",
"properties" : {
"a" : {
"type" : "string"
},
"b" : {
"type" : "string"
},
"c" : {
"type" : "string"
}
},
"oneOf" : [{
"properties" : {
"attr1" : {
"type" : "array"
}
},
"required":["attr1"]
}, {
"properties" : {
"attr2" : {
"type" : "object"
}
},
"required":["attr2"]
}
]
}
请查看 official docs 以了解所有可能性。
正如@Jason 在评论中所建议的那样,如果您还想禁止其他属性,则只需将 attr1
和 attr2
放在顶层:
{
"type" : "object",
"properties" : {
"a" : {
"type" : "string"
},
"b" : {
"type" : "string"
},
"c" : {
"type" : "string"
},
"attr1" : {
"type" : "array"
},
"attr2" : {
"type" : "object"
}
},
"additionalProperties" : false,
"oneOf" : [{
"required" : ["attr1"]
}, {
"required" : ["attr2"]
}
]
}