JSON 模式 if/then 需要嵌套对象

标签 json jsonschema json-schema-validator

我有一个 JSON:

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

我想要验证: 如果 a0 为 true,则应需要 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 下的对象?

最佳答案

试试这个:

{
  "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 属性处开始 fork ,因此您必须包含从该点开始的整个结构。

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

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

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

关于JSON 模式 if/then 需要嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54535508/

相关文章:

amazon-web-services - 如何在 AWS::Serverless::Api 的 AWS SAM 模板中添加请求验证器?

jquery - IE 尝试从 EE 和 jQuery 表单插件下载 json 响应

ios - 将 json 对象添加到数组

JSON Schema 对象包含值

json - 从 json-schema 引用远程枚举值

jsonschema - 开放 API 规范 JWT - 子路径没有安全性

java - PUT 操作的 Android JSON api 问题

javascript - 在标记中嵌入脚本所需数据的方法

c# - JSON 不区分大小写

json - 有什么办法可以从Go中的给定JSON中提取JSON模式? [复制]