重用远程JSON模式中的属性,与原始模式处于同一级别

时间:2014-05-12 10:03:35

标签: javascript json jsonschema

我有一个远程架构“ 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
}

我想验证之前显示的示例,如您所见,所有属性都处于同一级别(非嵌套)。

这可能吗?如果有,怎么样?非常感谢你。

若昂

2 个答案:

答案 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);