如何定义至少需要许多属性之一的 JSON 模式
Posted
技术标签:
【中文标题】如何定义至少需要许多属性之一的 JSON 模式【英文标题】:How to define a JSON schema that requires at least one of many properties 【发布时间】:2015-10-28 15:30:56 【问题描述】:我想知道我是否可以定义一个 JSON 模式(草案 4),该模式至少需要一个对象的许多可能属性。我已经知道allOf
、anyOf
和oneOf
,但就是不知道如何以我想要的方式使用它们。
这里有一些示例 JSON 来说明:
// Test Data 1 - Should pass
"email": "hello@example.com",
"name": "John Doe"
// Test Data 2 - Should pass
"id": 1,
"name": "Jane Doe"
// Test Data 3 - Should pass
"id": 1,
"email": "hello@example.com",
"name": "John Smith"
// Test Data 4 - Should fail, invalid email
"id": 1,
"email": "thisIsNotAnEmail",
"name": "John Smith"
// Test Data 5 - Should fail, missing one of required properties
"name": "John Doe"
我想至少要求id
或email
(也接受它们)并且仍然根据格式通过验证。如果我同时提供两者(测试 3),使用 oneOf
验证失败,anyOf
验证通过,即使其中一个无效(测试 4)
这是我的架构:
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "https://example.com",
"properties":
"name":
"type": "string"
,
"anyOf": [
"properties":
"email":
"type": "string",
"format": "email"
,
"properties":
"id":
"type": "integer"
]
您能帮我如何正确验证我的用例吗?
【问题讨论】:
【参考方案1】:要至少要求一组属性中的一个,请在一系列 anyOf
选项中使用 required
:
"type": "object",
"anyOf": [
"required": ["id"],
"required": ["email"]
// any other properties, in a similar way
],
"properties":
// Your actual property definitions here
如果存在您想要的任何属性("id"
、"email"
),那么它将传递allOf
中的相应选项。
【讨论】:
【参考方案2】:您可以使用minProperties: number
(如果需要,还可以使用maxProperties: number
)。
这将缩短架构定义:
type: "object",
minProperties: 1,
properties: [/* your actual properties definitions */],
additionalProperties: false
文档链接:https://json-schema.org/understanding-json-schema/reference/object.html#size
【讨论】:
这实际上是一个糟糕的解决方案,因为不包含架构中定义的任何属性但具有架构中不存在的属性的对象仍将验证。示例: "foo": "bar"
将针对 "type": "object", "minProperties": 1, "properties": "test": "type": "string" , "bar": "type": "string"
进行验证。
@Benni 那么"additionalProperties": false
呢?
那行得通。阅读更多here。以上是关于如何定义至少需要许多属性之一的 JSON 模式的主要内容,如果未能解决你的问题,请参考以下文章
VSCode仅为许多项目之一创建Launch.json和Tasks.json文件
使用 Apache Beam 和数据流将许多 json 加载到 BQ - json 模式错误