我正在尝试编写一个模式,以便在将yaml文件解析为JSON之后对其进行验证。
假设这是我的.yml文件,包含两个顶级属性:汽车和车库。
汽车是可选的,而车库是必需的。
然而,garage的一个子属性是汽车。如果定义了garage下的cars,我希望模式确保顶层的cars也被定义。否则,该模式将无效
cars:
- BMW
- Mercedes-Benz
- Audi
garage:
location: Miami
cars:
- BMW
- Audi
我的架构:
{
properties: {
cars: {
type: 'array',
items: {
type: 'string'
}
},
garage: {
type: 'object',
properties: {
location: {
type: 'string'
},
cars: {
type: 'array'
}
},
required: ['garage']
}}
所以我试着在顶层做一个if-else
{
if: { properties: { garage: { cars: {type: 'array'}}}},
then: {required:['cars']},
properties: {
cars: {
type: 'array',
items: {
type: 'string'
}
},
garage: {
type: 'object',
properties: {
location: {
type: 'string'
},
cars: {
type: 'array'
}
},
required: ['garage']
}}
但似乎我做错了,或者它没有达到这个目的。
另外,在顶层执行anyOf来匹配子模式对我来说也不起作用。
有什么帮助吗?
发布于 2019-07-27 17:10:27
您可以使用"JSON扩展结构模式“语言JESS指定引用完整性约束(以及所有其他要求)。
下面是作为单个JSON文档呈现的完整JESS模式:
[ "&",
["&",
{"::>=": {"garage": {"location": "string", "cars": [ "string" ] } } }
],
{"ifcond": { "has": "cars" },
"then": ["&", { "forall": ".[cars]", "schema": ["string"] } ]
},
{"setof": ".[garage]|.[cars][]", "subsetof": ".[cars][]"}
]
第一个"&“介绍了三个要求的结合,最后一个是参照完整性约束。
JESS repository有一个模式一致性检查器,我用它来验证您的样本(表示为JSON)是否符合上面的模式。
发布于 2019-04-25 05:50:47
if
的值必须是JSON Schema。如果将if
的值作为它自己的JSON Schema,并测试将其应用到JSON实例中正确位置的验证结果,可能会帮助您调试这类问题。
在if
块中,需要将嵌套cars
放在properties
下,就像在主模式中所做的那样。
您可能还想在您的if
模块中同时制造所需的车库和汽车。]
但是,您不能定义希望将来自garage.cars
的值包含在cars
数组中。
https://stackoverflow.com/questions/55836982
复制相似问题