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

mxg2im7a  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(114)

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

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

以及

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

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

**UPDATE:**两个JSON示例都不允许附加属性。

谢啦,谢啦

hfsqlsce

hfsqlsce1#

是的,您可以使用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"]
        }
    ]
}

请看一下官方文件来审查所有的可能性。
正如@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"]
        }
    ]
}
yfjy0ee7

yfjy0ee72#

是的,您将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

相关问题