我有一个远程架构“ person.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 在同一级别 的属性:“name,gender等”作为属性:“beau,mustache”来自man上传.json。
验证示例
{
name: 'John',
gender: 'm',
age: 29,
beard: false,
moustache: true
}
我想验证之前显示的示例,如您所见,所有属性都处于同一级别(非嵌套)。
这可能吗?如果有,怎么样?非常感谢你。
若昂
答案 0 :(得分:1)
您想要使用allOf
关键字,并结合$ref
:
{
"id": "/schemas/man.json",
"allOf": [{"$ref": "person.json"}],
...
}
(注意:这是v4。在v3中,同样的事情被称为extends
。)
简单地说," Man模式之后的每个实例也必须遵循Person模式"。
更大的问题实际上是您使用additionalPropeties
。由于person.json
禁止其他属性,因此任何具有"beard"
属性的实例实际上不是有效的人。如果您要扩展Person,我建议您删除禁止其他属性的约束。
(注意:此行为是JSON Schema社区中某些冲突的主题,但这是规范中的内容。)
答案 1 :(得分:0)
我猜测一条数据不能同时满足两个模式,因此您需要创建第三个模式,将它们组合起来并对其进行验证。
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);