json 架构 oneOf 验证问题...无法获得正确的验证
Issue with json schema oneOf validation ... Not able to get the right validation
我需要帮助来验证具有以下约束的 json 对象。
我的对象有四个子对象。
有效对象
{"obj" : { "obj1" : {}, "obj2" : {} } }
{"obj" : { "obj1" : {}, "obj3" : {} } }
{"obj" : { "obj1" : {}, "obj4" : {} } }
{"obj" : { "obj1" : {} } }
无效对象
{"obj" : { "obj1" : {}, "obj3" : {}, "obj4" : {} } }
{"obj" : { "obj1" : {}, "obj2" : {}, "obj4" : {} } }
{"obj" : { "obj1" : {}, "obj2" : {}, "obj3" : {} } }
{"obj" : { "obj1" : {}, "obj2" : {}, "obj3" : {}, "obj4" : {} } }
obj2、obj3、obj4 只能存在一个,或者 none 应该存在。
表达互斥属性非常简单。
"oneOf": [
{ "required": ["obj2"] },
{ "required": ["obj3"] },
{ "required": ["obj4"] }
]
棘手的部分是 "or none" 约束。您必须向禁止所有属性的 oneOf
添加架构。有几种方法可以做到这一点,但我认为以下方法即使不是最直接的也是最干净的。
"oneOf": [
{
"properties": {
"obj2": false,
"obj3": false,
"obj4": false
}
},
{ "required": ["obj2"] },
{ "required": ["obj3"] },
{ "required": ["obj4"] }
]
另一种方法是使用 dependencies
而不是 oneOf
。
"dependencies": {
"obj2": { "not": { "required": ["obj3"] } },
"obj3": { "not": { "required": ["obj4"] } },
"obj4": { "not": { "required": ["obj2"] } }
}
它的代码少得多并且扩展性更好,但它并不能立即清楚它在做什么或者 how/why 它有效(它确实有效,我保证)。
我需要帮助来验证具有以下约束的 json 对象。
我的对象有四个子对象。
有效对象
{"obj" : { "obj1" : {}, "obj2" : {} } }
{"obj" : { "obj1" : {}, "obj3" : {} } }
{"obj" : { "obj1" : {}, "obj4" : {} } }
{"obj" : { "obj1" : {} } }
无效对象
{"obj" : { "obj1" : {}, "obj3" : {}, "obj4" : {} } }
{"obj" : { "obj1" : {}, "obj2" : {}, "obj4" : {} } }
{"obj" : { "obj1" : {}, "obj2" : {}, "obj3" : {} } }
{"obj" : { "obj1" : {}, "obj2" : {}, "obj3" : {}, "obj4" : {} } }
obj2、obj3、obj4 只能存在一个,或者 none 应该存在。
表达互斥属性非常简单。
"oneOf": [
{ "required": ["obj2"] },
{ "required": ["obj3"] },
{ "required": ["obj4"] }
]
棘手的部分是 "or none" 约束。您必须向禁止所有属性的 oneOf
添加架构。有几种方法可以做到这一点,但我认为以下方法即使不是最直接的也是最干净的。
"oneOf": [
{
"properties": {
"obj2": false,
"obj3": false,
"obj4": false
}
},
{ "required": ["obj2"] },
{ "required": ["obj3"] },
{ "required": ["obj4"] }
]
另一种方法是使用 dependencies
而不是 oneOf
。
"dependencies": {
"obj2": { "not": { "required": ["obj3"] } },
"obj3": { "not": { "required": ["obj4"] } },
"obj4": { "not": { "required": ["obj2"] } }
}
它的代码少得多并且扩展性更好,但它并不能立即清楚它在做什么或者 how/why 它有效(它确实有效,我保证)。