required
属性指示是否必须定义已定义的字段: {
"$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
字段不是必填字段。有什么方法可以使此字段的强制性成为条件吗?#1 楼
根据您的情况,有几种不同的方法。我可以想到四种有条件地需要一个字段的方法。依赖项
dependencies
关键字是required
关键字的条件变体。 dependencies
中的Foreach属性,如果该属性存在于正在验证的JSON中,则与该键关联的架构也必须有效。如果存在“ foo”属性,则需要“ bar”属性{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
如果模式仅包含
required
关键字,则还有一个简短形式。 br /> {
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
蕴涵
如果您的条件取决于字段的值,则可以使用称为蕴涵的布尔逻辑概念。 “ A暗示B”有效地表示,如果A为true,则B也必须为true。含义也可以表示为“!A或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"]
}
]
}
If-Then-Else
相对较新的加法JSON Schema(草案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"] }
}
编辑12/23/2017:隐含部分已更新,并且如果-则
编辑06/04/2018:If-Then-Else的错误修复,并更新单例
enum
以使用const
。评论
@scubbo我不喜欢if-then-else关键字,并且我拒绝使用它们。但是,如果您选择使用它,我建议始终将它们包装在只包含这三个关键字的allOf中。 {... other_keywords ...,“ allOf”:[{“ if”:...,“ then”:...,“ else”:...}],... more_keywords ...}
–杰森·德罗斯(Jason Desrosiers)
18-4-5在0:20
@Jason为什么不喜欢...?我认为在您的回答中对此有一个简短的意见是完全合理的。还是长话短说?
–粘土桥
18年5月14日在13:46
@ClayBridges评论部分不是该讨论的正确位置,但这是简短的版本。通常,JSON Schema关键字是无状态的。除关键字值外,没有其他信息可用于验证实例。如果,那么和其他违反此规则,因为它们彼此依赖。
–杰森·德罗斯(Jason Desrosiers)
18年5月15日在3:55
@GGirard,这是我所知道的在JSON模式中使用这些模式的最佳方法。布尔运算已正式记录,但其余只是数学运算。 allOf == AND,anyOf == OR,oneOf == XOR,而不是== NOT。您可以在“布尔代数”上搜索Google,以获取有关数学知识的更多资源(例如蕴涵)。
–杰森·德罗斯(Jason Desrosiers)
19年2月27日在17:26
@AlexeyShrub我一直想写一阵子,但是被其他事情分散了注意力。我喜欢有条件的想法。它确实使人们更容易理解。我反对将其定义为三个独立的有状态关键字的方式(请参阅前面的评论)。如果关键字违反其他关键字遵循的架构属性,则将使JSON Schema验证器更难以实现且效率更低。如果条件是以无状态的另一种方式定义的,那么我将没有异议。
–杰森·德罗斯(Jason Desrosiers)
19 Mar 26 '19在15:59
评论
是的,应该有可能。数据中的哪些信息会触发强制性?@SarveswaranMeenakshiSundaram-我不知道我只使用了json模式的v4
版本3完全有可能吗?
@SarveswaranMeenakshiSundaram-我不知道。试试看,让我们知道!