从远程JSON模式重用属性,在原始模式的同一级别
我有一个远程模式“person.json”,保存在另一个文件中。从远程JSON模式重用属性,在原始模式的同一级别
{
"id":"#person",
"type":"object",
"properties": {
"name": {"type":"string"},
"gender": {
"type":"string",
"enum":["m", "f"]
},
"age": {"type":"number"}
},
"additionalProperties": false
}
而且我有一个 “man.json” 的模式,这是一个我原来的架构。
{
"id":"#man",
"type":"object",
"$ref":"person.json",
"properties": {
"beard":"boolean",
"moustache":"boolean"
},
"required": ["name"],
"additionalProperties": false
}
我想使用的属性:在同一水平的性质从person.json “姓名,性别,等等”:“胡须”,从man.json。
审定
{
name: 'John',
gender: 'm',
age: 29,
beard: false,
moustache: true
}
我要验证的先前示出的例子,当你看,与在相同的水平(未嵌套的)所有属性为例。
这可能吗?如果是,如何?非常感谢你。
若昂
您要使用的allOf
关键字,与$ref
结合:
{
"id": "/schemas/man.json",
"allOf": [{"$ref": "person.json"}],
...
}
(注:这是V4在v3中,同样的事情被称为extends
。)
用简单的英语,它表示“每个Man模式之后的实例也必须遵循Person模式”。
更大的问题是您使用additionalPropeties
。由于person.json
禁止附加属性,因此使用"beard"
属性的任何实例实际上都是而非有效人员。如果你打算扩展Person,我建议你删除禁止附加属性的约束。
(注:这种行为是在JSON模式社区的一些冲突的问题,但是这是在规格)
我猜测一块数据不能同时满足两个模式,所以你需要创建第三个模式,结合他们和验证针对。
var personSchema = JSON.parse(person_json);
var manSchema = JSON.parse(man_json)
for (var personProp in personSchema.properties) {
manSchema.properties[personProp] = personSchema.properties[personProp];
}
var manPersonSchema = JSON.stringify(manSchema);
您的解决方案看上去不错。唯一的问题是我有我的架构在不同的文件。要取得它们并将它们合并起来会更困难。我做了另一种方式。不管怎么说,还是要谢谢你。 – joaorodr84
这是一个耻辱,json不支持这样一个重要的功能。我不能丢弃“附加属性= false”。我使用了一些重复的代码。这不是一个好的解决方案,但它可以像我想要的那样工作。谢谢。 – joaorodr84
additionalProperties的解决方法可能是为人提供一种抽象基类;一个abstractPerson类,不禁止additionalProperties,可以包含allOf到人和人中。 – fiddur