Json模式无法验证/无法使用子模式

时间:2020-03-13 09:52:44

标签: json validation jsonschema json-schema-validator

我有下面显示的json。我想让它针对必须具有zoo_unique_code的Zoo列表工作。但是可以有动物或鸟类,或者两者都有,也可以没有。但是我想用子模式验证它是否具有动物或鸟类,例如bird / animal_id。子模式似乎不起作用。

{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
    "animal_id": {
        "type": "string",
        "maxLength": 24
    },
    "bird_id": {
        "type": "string",
        "maxLength": 50
    },
    "zoo_bird_and_animal": {
        "type": "object",
        "anyOf": [{
                "properties": {
                    "zoo_bird": {
                        "type": "object",
                        "required": [
                            "zoo_bird_id"
                        ],
                        "properties": {
                            "zoo_bird_id": {
                                "$ref": "#/definitions/bird_id"
                            }
                        }
                    }
                }
            }, {
                "properties": {
                    "zoo_animal": {
                        "type": "object",
                        "required": [
                            "zoo_animal_id"
                        ],
                        "properties": {
                            "zoo_animal_id": {
                                "$ref": "#/definitions/animal_id"
                            }
                        }
                    }
                }
            }
        ]
    }
},
"properties": {
    "zoo_list": {
        "type": "array",
        "minItems": 1,
        "items": {
            "type": "object",
            "required": [
                "zoo_unique_code"
            ],
            "minProperties": 1,
            "properties": {
                "zoo_unique_code": {
                    "type": "string",
                    "enum": [
                        "NEWYORKZOO",
                        "PARISZOO"
                    ]
                }
            },
            "$ref": "#/definitions/zoo_bird_and_animal"
        }
    }
}
}

并使用

对其进行测试
{
   "zoo_list": [
    {
     "zoo_unique_code": "NEWYORKCODE",
        "zoo_bird": {
            "zoo_bird_id": "newid"
        }
    }
   ]
}

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

据我所知,您似乎想在最后使用组合模式,而不是在同一项目中使用ref

有了这个allOf,模式就必须是有效的对象,就像items中定义的一样,就像ref中的definitions

另一个错误来自使用anyOf而不是allOf

对于anyOf,它必须针对第一个或第二个模式都有效,因为两者都针对一个对象进行验证,即使第一个模式无效,第二个模式也有效,因此所有内容都是有效的。也可以使用additionalProperties进行更改,但是这样不能像嵌套它那样工作。

anyOf:只要值针对这些架构中的任何一个进行验证,就被视为针对整个组合架构有效。 -combining-schemas

您还希望在此处使用allOf,因此它必须针对所有人进行验证,或者重写此条件以在此处不使用对象。

经过anyOfallOf的修改,您给定的数据现在也可以验证bird_id

我认为您在这里没有使用draft-04,看起来像draft-7

{
  "type": "object",
  "$schema": "http://json-schema.org/draft-04/schema#",
  "definitions": {
    "animal_id": {
      "type": "string",
      "maxLength": 24
    },
    "bird_id": {
      "type": "string",
      "maxLength": 50
    },
    "zoo_bird_and_animal": {
      "type": "object",
      "allOf": [
        {
          "properties": {
            "zoo_bird": {
              "type": "object",
              "required": [
                "zoo_bird_id"
              ],
              "properties": {
                "zoo_bird_id": {
                  "$ref": "#/definitions/bird_id"
                }
              }
            }
          }
        },
        {
          "properties": {
            "zoo_animal": {
              "type": "object",
              "required": [
                "zoo_animal_id"
              ],
              "properties": {
                "zoo_animal_id": {
                  "$ref": "#/definitions/animal_id"
                }
              }
            }
          }
        }
      ]
    }
  },
  "properties": {
    "zoo_list": {
      "type": "array",
      "minItems": 1,
      "items": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "zoo_unique_code"
            ],
            "minProperties": 1,
            "properties": {
              "zoo_unique_code": {
                "type": "string",
                "enum": [
                  "NEWYORKZOO",
                  "PARISZOO"
                ]
              }
            }
          },
          {
            "$ref": "#/definitions/zoo_bird_and_animal"
          }
        ]
      }
    }
  }
}

无效数据,请参阅:invalid

{
  "zoo_list": [
    {
      "zoo_unique_code": "NEWYORKCODE",
      "zoo_bird": {
        "zoo_bird_id": "newidnewidnewidnewidnewidnewidnewnewidnewidnewidnewidnewidnewidnew"
      }
    }
  ]
}

有效数据,请参见valid

{
  "zoo_list": [
    {
      "zoo_unique_code": "NEWYORKZOO",
      "zoo_bird": {
        "zoo_bird_id": "newid"
      }
    }
  ]
}