web-dev-qa-db-ja.com

オブジェクトの配列のJSONスキーマを作成する方法は?

私のJSON文字列は次のようにフォーマットされます:

{
    "count":3,
    "data":[
        {
            "a":{"ax":1}
        },
        {
            "b":{"bx":2}
        },
        {
            "c":{"cx":4}
        }
    ]
}

data配列には、多くのabcが含まれています。他の種類のオブジェクトはありません。

count==0の場合、dataは空の配列[]にする必要があります。

RubyでこのようなJSONオブジェクトを検証するために https://github.com/hoxworth/json-schema を使用しています。

require 'rubygems'
require 'json-schema'

p JSON::Validator.fully_validate('schema.json',"test.json")

schema.jsonは:

{
  "type":"object",
  "$schema": "http://json-schema.org/draft-03/schema",
  "required":true,
  "properties":{
     "count": { "type":"number", "id": "count", "required":true },
     "data": { "type":"array", "id": "data", "required":true,
       "items":[
           { "type":"object", "required":false, "properties":{ "a": { "type":"object", "id": "a", "required":true, "properties":{ "ax": { "type":"number", "id": "ax", "required":true } } } } },
           { "type":"object",  "required":false, "properties":{ "b": { "type":"object", "id": "b", "required":true, "properties":{ "bx": { "type":"number", "id": "bx", "required":true } } } } },
           { "type":"object",  "required":false, "properties":{ "c": { "type":"object", "id": "c", "required":true, "properties":{ "cx": { "type":"number", "id": "cx", "required":true } } } } }
       ]
     }
  }
}

しかし、これがtest.jsonの場合は検証に合格しますが、失敗するはずです。

{
  "count":3,
  "data":[
      {
          "a":{"ax":1}
      },
      {
          "b":{"bx":2}
      },
      {
          "c":{"cx":2}
      },
      {
          "c": {"z":"aa"}
      }
   ]
}

そして、これはtest.jsonとして失敗しますが、パスするはずです:

{
  "count":3,
  "data":[
      {
          "a":{"ax":1}
      },
      {
          "b":{"bx":2}
      }
   ]
}

誤ったスキーマがdata配列にa,b,cが1回含まれていることを検証しているようです。

適切なスキーマは何ですか?

22
Green Su

JSONスキーマ仕様 、セクション5.5から。アイテム:

この属性値がスキーマとインスタンスの配列である場合
値は配列であり、インスタンス配列の各位置は準拠する必要があります
この配列に対応する位置のスキーマに。この
タプルタイピングと呼ばれます。

スキーマ定義では、配列の最初の3つの要素が「a」、「b」、および「c」要素と完全に一致している必要があります。 itemsを空のままにすると、任意の配列要素が許可されます。同様に、additionalItemsを空のままにすると、追加の配列要素が許可されます。

必要なものを取得するには、"additionalItems": falseを指定する必要があります。itemsについては、次の(定義から多少短縮した)が機能すると思います。

"items": {
  "type": [
     {"type":"object", "properties": {"a": {"type": "object", "properties": {"ax": { "type":"number"}}}}},
     {"type":"object", "properties": {"b": {"type": "object", "properties": {"bx": { "type":"number"}}}}},
     {"type":"object", "properties": {"c": {"type": "object", "properties": {"cx": { "type":"number"}}}}}
  ]
}
30
Confusion