我有两个非常相似的JSON对象:
{
"a": "a",
"b": "b",
"c": "c",
"attr1": []
}
和
{
"a": "a",
"b": "b",
"c": "c",
"attr2": {}
}
草案v4中是否有可能为这两个实例定义一个模式?
更新:两个JSON实例都不允许使用其他属性。
由于
答案 0 :(得分:2)
是的,如果两者都存在,您可以使用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"]
}
]
}
答案 1 :(得分:0)
是的,你将attr1设置为null:
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