为两个几乎相同的实例定义一个JSON模式

时间:2015-12-16 17:39:36

标签: json properties schema jsonschema

我有两个非常相似的JSON对象:

{
    "a": "a",
    "b": "b",
    "c": "c",
    "attr1": []
}

{
    "a": "a",
    "b": "b",
    "c": "c",
    "attr2": {}
}

草案v4中是否有可能为这两个实例定义一个模式?

更新:两个JSON实例都不允许使用其他属性。

由于

2 个答案:

答案 0 :(得分:2)

是的,如果两者都存在,您可以使用oneOf关键字接受attr1attr2或使用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在评论中所建议的那样,如果您还想禁止其他属性,则只需将attr1attr2置于顶层:

{
    "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