如何定义至少需要许多属性之一的 JSON 架构
How to define a JSON schema that requires at least one of many properties
我想知道我是否可以定义一个 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
验证失败,即使其中一个无效(测试 4)
,anyOf
通过验证
这是我的架构:
{
"$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"
}
}
}
]
}
你能帮我如何为我的用例实现正确的验证吗?
要至少需要一组属性中的一个,请在一系列 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
中的相应选项。
您可以使用 minProperties: number
(如果需要,也可以使用 maxProperties: number
)。
这将缩短架构定义:
{
type: "object",
minProperties: 1,
properties: [/* your actual properties definitions */],
additionalProperties: false
}
Link 到文档:https://json-schema.org/understanding-json-schema/reference/object.html#size
我想知道我是否可以定义一个 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
验证失败,即使其中一个无效(测试 4)
anyOf
通过验证
这是我的架构:
{
"$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"
}
}
}
]
}
你能帮我如何为我的用例实现正确的验证吗?
要至少需要一组属性中的一个,请在一系列 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
中的相应选项。
您可以使用 minProperties: number
(如果需要,也可以使用 maxProperties: number
)。
这将缩短架构定义:
{
type: "object",
minProperties: 1,
properties: [/* your actual properties definitions */],
additionalProperties: false
}
Link 到文档:https://json-schema.org/understanding-json-schema/reference/object.html#size