2017-08-29 17 views
1

次の配列項目を検証する必要があります。JSONスキーマ内の任意の定義を持つ配列内のすべてのインスタンスを検証する方法

{ 
    contents: [{ 
     type: "text", 
     content: "This is text context" 
    }, { 
     type: "image", 
     content: "http://image.url" 
    }] 
} 

コンテンツアレイ内のすべてのアイテムを検証する必要があります。

コンテンツオブジェクトは、それぞれtypecontentのプロパティを持つ必要があります。 typeは、「テキスト」、「画像」または「ビデオ」とすることができます。 画像または動画の場合、contentは有効なURLである必要があります。

私は以下のスキーマを書いています。

{ 
    "id": "post", 
    "description": "generell schema for a post", 
    "definitions": { 
     "contents": { 
      "type": "array", 
      "minItems": 1, 
      "items": { 
       "allOf": [ 
        { "$ref": "#/definitions/text" }, 
        { "$ref": "#/definitions/image" }, 
        { "$ref": "#/definitions/video" }, 
        { "$ref": "#/definitions/mention" } 
       ] 
      } 
     }, 
     "text": { 
      "properties": { 
       "type": {"enum": ["text"]}, 
       "content": {"type": "string"} 
      }, 
      "required": [ 
       "content", 
       "type" 
      ] 
     }, 
     "image": { 
      "properties": { 
       "type": {"enum": ["image"]}, 
       "content": { 
        "type": "string", 
        "format": "url" 
       } 
      }, 
      "required": [ 
       "content", 
       "type" 
      ] 
     }, 
     "video": { 
      "properties": { 
       "type": {"enum": ["video"]}, 
       "content": { 
        "type": "string", 
        "format": "url" 
       } 
      }, 
      "required": [ 
       "content", 
       "type" 
      ] 
     } 
    } 

} 

ただし、上記のJSONはスキーマでは無効です。それはdata.contents[0].type should be equal to one of the allowed values

私はanyOfの代わりに使用する場合は有効です。しかし、イメージの内容は有効なURLのない文字列にすることができます。

正しいスキーマは何ですか?

+0

質問は? – Pedro

答えて

0

を使用する場合は、先にallOfを使用しています。

ルート項目にもプロパティ定義が必要です。うまくいけば、以下の変更は、あなたが必要とする解決策を得るのに役立ちます。

{ 
    "id": "post", 
    "description": "generell schema for a post", 
    "properties": { 
     "contents": { 
      "type": "array", 
      "minItems": 1, 
      "items": { 
       "oneOf": [ 
        { "$ref": "#/definitions/text" }, 
        { "$ref": "#/definitions/image" }, 
        { "$ref": "#/definitions/video" }, 
        { "$ref": "#/definitions/mention" } 
       ] 
      } 
     } 
    } 
    "definitions": { 
     "text": { 
      "properties": { 
       "type": {"enum": ["text"]}, 
       "content": {"type": "string"} 
      }, 
      "required": [ 
       "content", 
       "type" 
      ] 
     }, 
     "image": { 
      "properties": { 
       "type": {"enum": ["image"]}, 
       "content": { 
        "type": "string", 
        "format": "url" 
       } 
      }, 
      "required": [ 
       "content", 
       "type" 
      ] 
     }, 
     "video": { 
      "properties": { 
       "type": {"enum": ["video"]}, 
       "content": { 
        "type": "string", 
        "format": "url" 
       } 
      }, 
      "required": [ 
       "content", 
       "type" 
      ] 
     } 
    } 

} 
関連する問題