如何写对象的数组JSON模式?(How to write a JSON schema for arr

2019-07-29 15:08发布

我的JSON字符串将被格式化为:

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

data阵列包含许多abc 。 并没有其他类型的对象。

如果count==0data应该是空数组[]

我使用https://github.com/hoxworth/json-schema验证在Ruby中这种JSON对象。

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一次。

正确的模式应该是什么?

Answer 1:

从JSON架构规范 ,5.5节。 项目:

当该属性值是模式和实例的阵列
值是一个数组,该实例阵列中的每个位置必须符合
在此阵列中的对应位置的模式。 这个
所谓的元组打字。

您的架构定义需要阵列的前三个元素是恰好那些“一个”,“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"}}}}}
  ]
}


文章来源: How to write a JSON schema for array of objects?