私のJSON文字列は次のようにフォーマットされます:
{
"count":3,
"data":[
{
"a":{"ax":1}
},
{
"b":{"bx":2}
},
{
"c":{"cx":4}
}
]
}
data
配列には、多くのa
とb
とc
が含まれています。他の種類のオブジェクトはありません。
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回含まれていることを検証しているようです。
適切なスキーマは何ですか?
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"}}}}}
]
}