2017-09-05 61 views
0

我有一個json模式,我有3種類型的媒體,標題,圖像和頭像。如何從json模式中獲取值的類型引用

這些介質類型都有不同的結構,所以我使用$refoneOf來指定哪些是有效的選項。

但是,我無法弄清楚如何根據兄弟的值指定使用哪個引用。

我的模式是這樣的

const mediaSchema = { 
    "type": "object", 
    "required": ["mediaType", "content", "points"], 
    "properties":{ 
     "mediaType": {"type":"string", "pattern": "^(image|avatar|caption)$"}, 
     "content": { 
      "oneOf": [ 
       {"$ref":"#/definitions/image"}, 
       {"$ref": "#/definitions/caption"}, 
       {"$ref": "#/definitions/avatar"} 
      ], 
     } 
    }, 
    "definitions": { 
     "caption": 
      {"type": "object", 
       "required": ["text"], 
       "properties": { 
        "text": {"type": "string"}, 
        "fontSize": {"type": "string", "pattern": "^[0-9]{1,3}px$"} 
      } 
     }, 
     "image": {"type": "string", "format": "url"}, 
     "avatar": 
      {"type": "object", 
       "properties": { 
        "name": {"type": "string"}, 
        "image": {"type": "string", "format":"url"} 
      } 
     } 
    } 
} 

,當我這樣定義

mediaItem = { 
    "mediaType":"avatar", 
    "content": { 
     "name": "user name", 
     "avatar": "https://urlToImage 
    } 
} 

頭像應該是有效的,但如果我定義頭像作爲

mediaItem = { 
    "mediaType": "avatar", 
    "content": "https://urlToImage" 
} 

它應該拋出一個錯誤,因爲這對於媒體類型的頭像無效。

回答

1

你是在正確的軌道上,但你應該把oneOf調度到架構的根源,並定義"content"有3個獨立的常數作爲鑑別,就像這樣:

{ 
    "oneOf": [ 
     { 
      "type": "object", 
      "properties": { 
       "mediaType": { 
        "const": "avatar" 
       }, 
       "content": { "$ref": "#/definitions/avatar" } 
      }, 
      "required": ["mediaType", "content"] 
     }, 
     // ... 
    ], 
    "definitions": { 
     // ... 
    } 
} 

注意: "const"關鍵字僅存在於最新版本的json模式(draft6)中。可能會發生您使用的驗證器實現尚不支持它。在這種情況下,您可以使用單元素枚舉來代替"const": "avatar",例如"enum": ["avatar"]

+0

正在工作,但錯誤報告非常糟糕。在我的測試中,我得到'expected'data.mediaType應該等於常量,data.mediaType應該等於常量,data.mediaType應該等於常量,數據應該完全匹配oneOf'中的一個模式'是否有更好的錯誤輸出?這表明模式應該是什麼? – pedalpete

+0

你使用什麼json模式庫? – erosb

+0

我使用ajv,你熟悉它嗎?大概是一個單獨的問題,我認爲圖書館之間的錯誤會被標準化。 https://github.com/epoberezkin/ajv,我會在那裏看看它。對不起,這個問題困擾你。 – pedalpete