我正在尝试实现这个条件:如果某个特定属性存在,则需要另一个属性;但如果该属性不存在,则不需要另一个属性。
另外,在JSON模式中,我们可以在依赖中使用not吗?
以下是一个示例模式
var schema = {
"properties": {
"smaller": {
"type": "number"
},
"larger": { "type": "number" },
"medium":{'type':'string'},
"bulky":{'type':'string'}
},
require:['smaller','larger'],
additionalProperties:false
};如果存在"medium“,则需要"bulky”。否则,不需要"bulky“。
这里"not required“的意思是,如果"medium”不存在,那么一定不会出现bulky。
发布于 2018-11-21 09:11:59
即使不使用JSON Schema draft-07 if-then-else,也有几种方法可以达到所需的效果。
逻辑运算符和蕴含(草案-04及以上)
这里的逻辑含义是:如果"medium“存在,则"bulky”可被翻译为"medium“not present或"bulky”is " required“(后者暗示"medium”存在),其可进一步阐述为"medium“not required或"bulky”为"required“(因为如果"medium”存在,它将满足被要求的条件)。请参阅下面的模式:
"properties": {
"smaller": {"type": "number"},
"larger": { "type": "number" },
"medium":{"type":"string"},
"bulky":{"type":"string"}
},
"required":["smaller","larger"],
"anyOf" : [
{
"not" : { "required" : ["medium"] }
},
{
"required" : ["bulky"]
}
],
"additionalProperties" : false请查看此处以供参考:
JSON schema - valid if object does *not* contain a particular property
http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.7
"anyOf“-逻辑或,"oneOf”-异或,"allOf“-与,”非“-否定,但要注意规范:
如果实例无法根据该关键字定义的架构成功验证,则该实例对该关键字有效。
draft-06 -依赖关系+ propertyNames
最明显的是。我不确定你是否在你的问题中排除了这一点,所以放在这里以防万一。请注意,如果您不想简单地限制有效键,可以使用"propertyNames“来代替"additionalProperties”(这实际上就是添加它的目的)。
"properties": {
"smaller": {"type": "number"},
"larger": { "type": "number" },
"medium":{"type":"string"},
"bulky":{"type":"string"}
},
"required":["smaller","larger"],
"dependencies" : {
"medium" : ["bulky"]
},
"propertyNames" : {
"enum" : [
"smaller",
"larger",
"medium",
"bulky"
]
}点击此处查看参考资料:http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.5.7
更新
在评论中澄清之后:
草案6的
-这里的“不需要”意味着如果“中”不存在,那么大的“一定不存在”
“一定不能”意味着防止笨重的存在。
我会重新表述你的病情:
1.如果"medium“存在,"bulky”必须存在,->两个键必须同时存在。
2.如果"medium“不存在,"bulky”不能同时存在, -> 不能同时存在。
“体量”是否存在,而“中等”是否不存在?
不是的。请参见2。反之亦然(请参见1)。布尔相等(与逻辑异或互补)。
因此,如果"bulky“存在-它意味着"medium”必须一直在那里...这意味着两者都是必需的,或者不能都是必需的(甚至是允许的)。
因为它是draft-06,所以您还可以使用"propertyNames“来定义允许的属性名称(这是此逻辑的一种快捷方式)。
逻辑运算符和蕴涵(草案-06及以上)
转换为JSOn模式的正确逻辑操作如下所示:
"oneOf" : [
{ "required" : ["medium","bulky"] }, <== this schema is satisfied if both keys appear in validated instance
{
"allOf" : [ <== !medium ^ !bulky - due to how "not" works in schema context
{"not" : { "required" : ["medium"] } },
{"not" : { "required" : ["bulky"] } },
]
}
]一个XOR -或(两者都需要)或(不需要中,也不需要大)。
请注意,我不是在做" not“:{ "required”:"medium","bulky“},因为当只有一个键存在时,"required”模式将失败,这意味着"not“将返回成功的验证结果。我们需要用德摩根定律来重新表述:
"oneOf" : [
{ "required" : ["medium","bulky"] },
{
"not" : { <=== !medium ^ !bulky = !(medium v bulky)
"anyOf" : [
{ "required" : ["medium"] },
{ "required" : ["bulky"] },
]
}
}
]不过,使用"propertyNames“也可以做到这一点。请参阅以下架构:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"properties": {
"smaller": {"type": "number"},
"larger": { "type": "number" },
"medium":{"type":"string"},
"bulky":{"type":"string"}
},
"required":["smaller","larger"],
"anyOf" : [
{
"required" : ["medium","bulky"]
},
{
"propertyNames" : {
"enum" : [
"smaller",
"larger"
]
},
}
],
"examples" : [
{
"smaller" : 1,
"larger" : 2,
},
{
"smaller" : 1,
"larger" : 2,
"bulky" : "test",
"medium" : ""
},
{
"smaller" : 1,
"larger" : 2,
"medium" : ""
},
{
"smaller" : 1,
"larger" : 2,
"bulky" : "test",
},
]
}它回答了你的问题吗?
发布于 2018-11-21 05:27:12
JSON模式草案-07包含了these new keywords if、then和else,它们允许您使用条件模式。
在此示例中:
foo属性为requiredfoo设置为"bar",则bar属性也变为必需的
var ajv = new Ajv({
allErrors: true
});
var schema = {
"properties": {
"foo": {
"type": "string"
},
"bar": {
"type": "string"
},
},
"required": ["foo"],
"if": {
"properties": {
"foo": {
"enum": ["bar"]
}
}
},
"then": {
"required": ["bar"]
}
}
var validate = ajv.compile(schema);
test({
"foo": "bar",
"bar": "baz"
}); // VALID
test({
"foo": "xyz"
}); // VALID
test({
"foo": "bar",
}); // NOT VALID
function test(data) {
var valid = validate(data);
if (valid) console.log('VALID', data);
else console.log('NOT VALID', data);
}<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/6.5.5/ajv.min.js"></script>
希望这是有意义的,你可以相应地调整你的代码。
PS:在您的模式中,您有require属性,我不确定它是否是有效的JSON schema关键字。您可能指的是required。
发布于 2019-11-11 16:48:20
如果有多个属性依赖于各自的值,则可以使用属性依赖关系。
{
"type": "object",
"properties": {
"weight_1": {
"type": "integer"
},
"weight_2": {
"type": "integer"
},
"description_1": {
"type": "string"
},
"description_2": {
"type": "string"
}
},
"allOf": [
{
"if": {
"properties": {
"weight_1": {
"minimum": 10
}
}
},
"then": {
"dependencies": {
"weight_1": ["description_1"]
}
}
},
{
"if": {
"properties": {
"weight_2": {
"minimum": 100
}
}
},
"then": {
"dependencies": {
"weight_2": ["description_2"]
}
}
}
]
}https://stackoverflow.com/questions/53398519
复制相似问题