jsonschema - JSON模式递归似乎没有正确验证
问题描述
我正在浏览文档以尝试弄清楚循环是如何工作的,以便我可以验证对象数组中的每个对象都与架构匹配。
似乎递归是我想要的,但给出的示例不起作用:https ://json-schema.org/understanding-json-schema/structuring.html
我正在尝试验证该示例,但它始终“有效”。我尝试更改 JSON 中的所有字段名称,但这没关系:
不知道发生了什么。对于这个例子,我将如何验证每个孩子是否与人员模式匹配(而不是静态地写出模式中的每一个)。
例如,我想验证这个 JSON。toplevel
在“objectsList”下可以有任意数量的对象和任意数量的对象。我想确保“objectsList”下的每个对象都具有正确的字段名称和类型(同样无需在架构中对整个事物进行硬编码):
{
"toplevel": {
"objectOne": {
"objectsList": [
{
"field1": 1231,
"field2": "sekfjlskjflsdf",
"field3": ["ssss","eeee"],
},
{
"field1": 11,
"field2": "sef",
"field3": ["eeee","qqqq"],
},
{
"field1": 1231,
"field2": "wwwww",
"field3": ["sisjflkssss","esdfsdeee"],
},
]
},
"objectTwo": {
"objectsList": [
{
"field1": 99999,
"field2": "yuyuyuyuyu",
"field3": ["ssssuuu","eeeeeee"],
},
{
"field1": 221,
"field2": "vesdlkfjssef",
"field3": ["ewerweeee","ddddq"],
},
]
},
}
}
解决方案
怎么了?
这里的问题不是递归——你的模式看起来不错。
根本问题与此处相同:https ://stackoverflow.com/a/61038256/5127499
JSON Schema 是为可扩展性而设计的。这意味着它允许添加任何类型的附加属性,只要它们不与已知/预期的关键字冲突。
解决方案
这里的解决方案是添加"additionalProperties": false
您的“人”(来自屏幕截图)和顶级架构,以防止那些不正确的对象被接受。您的第二个示例也是如此:如果您不想允许定义这些无关属性,则必须"type": "object"
添加任何定义。"additionalProperties": false
或者,您可以声明您的预期属性required
以确保至少存在这些属性。
为什么?
根据json-schema.org/understanding-json-schema(强调我的):
该
additionalProperties
关键字用于控制对额外内容的处理,即properties
其名称未在 properties 关键字中列出。默认情况下,允许任何其他属性。
additionalProperties
关键字可以是布尔值或对象。如果additionalProperties
是布尔值并设置为 false,则不允许使用其他属性。
推荐阅读
- closedxml - 我们可以克隆 XLWorkbook 对象吗(使用 ClosedXml)
- html - 使用 HTML & CSS3 : 如何垂直扩展内表的边框,使其接触外表
- java - Android - Kotlin Serializable vs Java Serializable ,性能一样吗?
- excel - VBA根据单元格中的值填充列范围
- php - php 在变量中查找新行并插入
- php - PHP 标头函数适用于本地 xampp 设置,但不适用于服务器
- jira - 如何配置 Jira 以从电子邮件创建票证?
- python - Python 蛮力 HelloWorld
- android - 如果手动安装,Android 应用程序会崩溃,如果使用 android studio 安装,则可以正常工作
- pyspark - PySpark 无法匹配数组