2014-05-12 19 views
1

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

我要验证的先前示出的例子,当你看,与在相同的水平(未嵌套的)所有属性为例。

这可能吗?如果是,如何?非常感谢你。

若昂

回答

1

您要使用的allOf关键字,与$ref结合:

{ 
    "id": "/schemas/man.json", 
    "allOf": [{"$ref": "person.json"}], 
    ... 
} 

(注:这是V4在v3中,同样的事情被称为extends。)

用简单的英语,它表示“每个Man模式之后的实例也必须遵循Person模式”。

更大的问题是您使用additionalPropeties。由于person.json禁止附加属性,因此使用"beard"属性的任何实例实际上都是而非有效人员。如果你打算扩展Person,我建议你删除禁止附加属性的约束。

(注:这种行为是在JSON模式社区的一些冲突的问题,但是这是在规格)

+0

这是一个耻辱,json不支持这样一个重要的功能。我不能丢弃“附加属性= false”。我使用了一些重复的代码。这不是一个好的解决方案,但它可以像我想要的那样工作。谢谢。 – joaorodr84

+0

additionalProperties的解决方法可能是为人提供一种抽象基类;一个abstractPerson类,不禁止additionalProperties,可以包含allOf到人和人中。 – fiddur

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); 
+0

您的解决方案看上去不错。唯一的问题是我有我的架构在不同的文件。要取得它们并将它们合并起来会更困难。我做了另一种方式。不管怎么说,还是要谢谢你。 – joaorodr84