2013-11-20 44 views
6

我想定义一个json模式来限制数组中的对象的属性。json模式验证具有anyOf和oneOf要求的对象数组

我至今是:

{ 
    "title":"myCollection", 
    "properties":{ 
     "things":{ 
      "type":"array", 
      "items":[{ 
       "title":"thingObj", 
       "type":"object", 
       "properties":{ 
        "name":{ 
         "type":"string" 
        }, 
        "code":{ 
         "type":"string" 
        }, 
        "type":{ 
         "type":"string", 
         "enum":["dog","cat"] 
        }, 
        "rate":{ 
         "type":"number" 
        }, 
        "value":{ 
         "type":"number" 
        } 
       }, 
       "anyOf":[{ 
        "properties":{ 
         "name":{ 
          "type":"string" 
         } 
        },"required":["name"] 
       },{ 
        "properties":{ 
         "code":{ 
          "type":"string" 
         } 
        },"required":["code"] 
       },{ 
        "properties":{ 
         "type":{ 
          "type":"string", 
          "enum":["new","existing"] 
         } 
        },"required":["type"] 
       }], 
       "oneOf":[{ 
        "properties":{ 
         "rate":{ 
          "type":"number" 
         } 
        }, 
        "required":["rate"] 
       },{ 
        "properties":{ 
         "value":{ 
          "type":"number" 
         } 
        }, 
        "required":["value"] 
       }], 
       "additionalProperties":false 
      }] 
     } 
    } 
} 

现在给出以下jsonobj:

{ 
    "things": [ 
     { 
      "name": "tabby", 
      "code": "meeow", 
      "type": "cat", 
      "value": 20 
     }, 
     { 
      "name": "k9", 
      "code": "woofer", 
      "type": "dog", 
      "rate": 15 
     } 
    ] 
} 

json schema validator提供了一个有效的回应,但这个验证似乎只适用于第一个元素阵列。如果删除anyOf子句中包含的所有字段或第一个元素上的oneOf子句,则验证将失败。第二个数组元素上的相同值不会引起所需的失败。我如何确保对每个数组成员运行验证?

回答

13

这是因为你有(偶然)使用“元组打字”。当"items"的值是一个数组并且它的模式与数组中的特定位置匹配时启用此功能。

如果您将"items"(在您的模式中)更改为简单模式(不是模式数组),那么它将以相同方式验证所有项目。

相关问题