【问题标题】:Define one JSON schema for two nearly the same instances为两个几乎相同的实例定义一个 JSON 模式
【发布时间】:2016-03-22 23:28:39
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 你到底想做什么?请您详细说明一下?

标签: json properties schema jsonschema


【解决方案1】:

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

【讨论】:

  • 我想更多的是关于如何定义一个schema,它允许数组和对象作为属性的值。
【解决方案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"]
        }
    ]
}

【讨论】:

  • 通常它可以工作,但允许架构中的任何其他属性。设置 "additionalProperties": false 时,"oneOf" 没有任何意义。如何正确排除其他属性,允许在 "attr1""attr2" 属性之间进行选择
  • @Alex-Bogdanov,您只需将“attr1”和“attr2”声明移至顶层properties。此外,您应该在顶层包含"type": "object",否则任何不是对象的东西都将成功验证。
  • @Alex-Bogdanov,您的问题中不包含该约束。为了用 Jason 的正确 cmets 更新答案,最好更新您的问题。
  • @jruizaranguren 已更新,但上面的架构仍然成功验证 JSON 对象,如下所示:inst = { "a": "a", "b": "b", "c": "c", "attr1": [], "d": {} }
  • @jruizaranguren,伙计们,这真是太棒了!有用!!!我真的不知道可以以这种方式使用 "oneOf", "anyOf" 属性来处理顶级属性。非常感谢你给我看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多