【问题标题】:JSON Schema if/then require nested objectJSON Schema if/then 需要嵌套对象
【发布时间】:2019-02-05 13:26:55
【问题描述】:

我有一个 JSON:

{
    "i0": {
        "j0": {
            "a0": true
        }
    },
    "i1": {
        "j1": {
            "a1": "stuff"
        }
    }
}

我想要一个验证: 如果a0 为真,则应该需要a1

我的架构目前是:

{
    "$schema": "http://json-schema.org/draft-07/schema",
    "id": "id",
    "type": "object",
    "required": [
        "i0",
        "i1"
    ],
    "allOf": [
        {
            "if": {
                "properties": {
                    "i0": {
                        "j0": {
                            "a0": true
                        }
                    }
                }
            },
            "then": {
                "properties": {
                    "i1": {
                        "j1": {
                            "required": [
                                "a1"
                            ]
                        }
                    }
                }
            }
        }
    ]
}

这个条件似乎实际上并没有运行。或者,如果我尝试将required 置于与我正在检查的值相同的级别,我已经看到了一个非常相似的工作条件。如:

"allOf": [
    {
        "if": {
            "a0": true
        },
        "then": {
            "required": [
                "a1"
            ]
        }
    }
]

但这需要a1a1 一起位于j0 之下。 如何根据j0 下的值要求j1 下的对象?

【问题讨论】:

    标签: json jsonschema json-schema-validator


    【解决方案1】:

    试试这个:

    {
      "if":{
        "type":"object",
        "properties":{
          "i0":{
            "type":"object",
            "properties":{
              "j0":{
                "type":"object",
                "required":["a0"]
              }
            },
            "required":["j0"]
          }
        },
        "required":["i0"]
      },
      "then":{
        "type":"object",
        "properties":{
          "i1":{
            "type":"object",
            "properties":{
              "j1":{
                "type":"object",
                "required":["a1"]
              }
            },
            "required":["j1"]
          }
        },
        "required":["i1"]
      }
    }
    

    您必须使用 if/then 关键字中的整体结构,从它们拥有的任何公共根开始。在这种情况下,它们的路径在 i0/i1 属性处开始分歧,因此您必须从该点包含整个结构。

    type 关键字确保您拥有一个对象,否则当使用其他类型(如 strings 或 booleans)时,架构可能会通过验证。

    required 关键字确保 if/then 子模式仅分别匹配实际包含 i0.j0.a0/i1.j1.a1 属性路径的对象。

    此外,a0/`a1 属性的 required 关键字仅指定它们存在。如果需要,您可以向该子模式添加更多验证。

    【讨论】:

    • 强调您需要像您一样在每个级别重复“properties”关键字 - 如果不是,就像 OP 所做的那样,“j1”和“a0”被视为未知/扩展关键字根本不评估,而不是作为属性名称。因为 Json 架构允许未知关键字,不幸的是,OP 的架构在语法上仍然有效,因此很难找到错误。
    • properties关键字中key的值必须是JSON Schema。以后,考虑从properties 关键字中测试每个键的值。 =]
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2019-10-22
    • 2021-03-18
    • 2017-09-14
    • 2019-10-11
    • 1970-01-01
    相关资源
    最近更新 更多