json - JSON Schema 是否支持深度对象验证?

标签 json jsonschema

我正在查看文档,但找不到任何直接或间接的解决方案。
有没有办法在不知道特定对象的确切位置的情况下对 JSON 对象进行验证?
例如,我想验证以下子对象:

{
  "grandParent": {
    "parent": {
      "child": {
        "name": "John"
      }
    }
  }
}
该对象可以是更大的 JSON 文件的一部分,其结构如下:
{
  "root": {
    "someKey": {
      "grandParent": ...
    },
    "grandParent": ...,
    ...<go in even deeper>: {
      "grandParent": ...
    }
  }
} 
我可以创建一个 json 模式来验证对象,无论它在哪里吗?
glob 中的类似示例是:root.**.grandParent.parent.child

最佳答案

您需要使用 additionalProperties 的组合, items , 和递归引用。
首先,我们定义要验证的结构。您必须定义 properties对于对象的每一层。
接下来,您希望您的根级别引用该定义。因为您使用的是预草案 2019-09 ,您需要将该引用包装在 allOf 中.
然后,您要确保对于对象,值应用了根架构,而对于数组,每个项目都应用了根架构。"$ref": "#"的使用解析为模式的根,它创建循环引用。
有些实现可能不喜欢这样,但大多数应该能够处理它。
这是以下架构的现场演示:https://jsonschema.dev/s/lBrZk

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "definitions": {
    "grandParentToChild": {
        "properties": {
          "grandParent": {
            "properties": {
              "parent": {
                "properties": {
                  "child": {
                    "properties": {
                      "name": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
    }
  },
  "allOf": [
    {
      "$ref": "#/definitions/grandParentToChild"
    }
  ],
  "additionalProperties": {
    "$ref": "#"
  },
  "items": {
    "$ref": "#"
  }
}

关于json - JSON Schema 是否支持深度对象验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67313037/

相关文章:

javascript - 解析字符串以提取JSON数组

Javascript:如果我不知道对象的键,如何访问嵌套对象中的值?

javascript - Google 图表堆叠条形图的 JSON 格式

java - SurveyMonkey API 是否有 json 架构?

c# - 如何在 C# 中从 json 模式创建默认的 json 对象

ruby-on-rails - 在输出为 json 之前过滤模型的属性

c# - 使用 System.Text.Json.Serialization 序列化 const

由枚举定义的 JSON Schema 对象属性

python-3.x - pymongo 是否支持 json 模式验证?

jsonschema - 在 JSON 模式中,定义和引用可重用的枚举类型?