2017-09-05 30 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

のような単一要素の列挙型に置き換えることはできますが、エラーレポートはかなり悪いです。私のテストでは、私は '期待 'data.mediaTypeは定数に等しくなければならない、data.mediaTypeは定数に等しくなければならず、data.mediaTypeは定数と等しくなければならず、データはoneOfで正確に一つのスキーマと一致しなければならない。エラー出力?どのようなスキーマが必要なのでしょうか? – pedalpete

+0

どのjsonスキーマライブラリを使用していますか? – erosb

+0

私はajvを使用しています、あなたはそれに精通していますか?たぶん別の質問かもしれないが、私はエラーがライブラリ間で標準化されると思った。 https://github.com/epoberezkin/ajv、私はそれを調べます。あなたの質問に迷惑をかけて申し訳ありません。 – pedalpete

関連する問題