有条件地需要 jsonSchema 属性
jsonSchema attribute conditionally required
在 jsonSchema 中,您可以使用“必需”属性指示定义的字段是否是必需的:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"header": {
"type": "object",
"properties": {
"messageName": {
"type": "string"
},
"messageVersion": {
"type": "string"
}
},
"required": [
"messageName",
"messageVersion"
]
}
},
"required": [
"header"
]
}
在某些情况下,我希望 messageVersion 字段不是强制性的。有什么办法可以使这个字段的强制性成为条件吗?
根据您的情况,有几种不同的方法。我可以想到四种不同的方式来有条件地要求一个字段。
依赖项
dependencies
关键字是 required
关键字的条件变体。对于 dependencies
中的每个 属性,如果 属性 存在于正在验证的 JSON 中,则与该键关联的架构也必须有效。 如果 "foo" 属性 存在,则需要 "bar" 属性
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
如果架构仅包含 required
关键字,则还有一个缩写形式。
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
含义
如果您的条件取决于字段的值,您可以使用称为蕴涵的布尔逻辑概念。 "A implies B" 实际上意味着,如果 A 为真,则 B 也必须为真。蕴涵也可以表示为“!A or B”。 要么 "foo" 属性 不等于 "bar",要么需要 "bar" 属性。或者,换句话说:如果"foo"属性等于"bar",则"bar"属性是必需的
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
如果 "foo" 不等于 "bar",则 #/anyOf/0
匹配并且验证成功。如果 "foo" 等于 "bar",#/anyOf/0
失败并且 #/anyOf/1
必须有效才能使 anyOf
验证成功。
枚举
如果您的条件基于枚举,则更直接一些。 "foo" 可以是 "bar" 或 "baz"。如果 "foo" 等于 "bar",则需要 "bar"。如果 "foo" 等于 "baz",则需要 "baz"。
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
如果-那么-其他
JSON Schema (draft-07) 的一个相对较新的添加添加了 if
、then
和 else
关键字。 如果"foo"属性等于"bar",则"bar"属性是必填项
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
编辑 2017 年 12 月 23 日: 更新了蕴涵部分并添加了 If-Then-Else 部分。
编辑 06/04/2018: If-Then-Else 的错误修复并更新单例 enum
s 以使用 const
.
在 jsonSchema 中,您可以使用“必需”属性指示定义的字段是否是必需的:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"header": {
"type": "object",
"properties": {
"messageName": {
"type": "string"
},
"messageVersion": {
"type": "string"
}
},
"required": [
"messageName",
"messageVersion"
]
}
},
"required": [
"header"
]
}
在某些情况下,我希望 messageVersion 字段不是强制性的。有什么办法可以使这个字段的强制性成为条件吗?
根据您的情况,有几种不同的方法。我可以想到四种不同的方式来有条件地要求一个字段。
依赖项
dependencies
关键字是 required
关键字的条件变体。对于 dependencies
中的每个 属性,如果 属性 存在于正在验证的 JSON 中,则与该键关联的架构也必须有效。 如果 "foo" 属性 存在,则需要 "bar" 属性
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
如果架构仅包含 required
关键字,则还有一个缩写形式。
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
含义
如果您的条件取决于字段的值,您可以使用称为蕴涵的布尔逻辑概念。 "A implies B" 实际上意味着,如果 A 为真,则 B 也必须为真。蕴涵也可以表示为“!A or B”。 要么 "foo" 属性 不等于 "bar",要么需要 "bar" 属性。或者,换句话说:如果"foo"属性等于"bar",则"bar"属性是必需的
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
如果 "foo" 不等于 "bar",则 #/anyOf/0
匹配并且验证成功。如果 "foo" 等于 "bar",#/anyOf/0
失败并且 #/anyOf/1
必须有效才能使 anyOf
验证成功。
枚举
如果您的条件基于枚举,则更直接一些。 "foo" 可以是 "bar" 或 "baz"。如果 "foo" 等于 "bar",则需要 "bar"。如果 "foo" 等于 "baz",则需要 "baz"。
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
如果-那么-其他
JSON Schema (draft-07) 的一个相对较新的添加添加了 if
、then
和 else
关键字。 如果"foo"属性等于"bar",则"bar"属性是必填项
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
编辑 2017 年 12 月 23 日: 更新了蕴涵部分并添加了 If-Then-Else 部分。
编辑 06/04/2018: If-Then-Else 的错误修复并更新单例 enum
s 以使用 const
.