为两个几乎相同的实例定义一个 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 关键字来接受 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"]
        }
    ]
}