2014-05-12 44 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