【问题标题】:Json schema not validating/working with sub schemaJson 模式未验证/使用子模式
【发布时间】:2020-03-13 09:52:44
【问题描述】:

我有下面显示的 json。我想让它对一个必须有 zoo_unique_code 的动物园列表起作用。但可以有动物或鸟类,或两者兼有,或都没有。但是我想用子模式验证它是否有动物或鸟类,例如鸟/动物 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"
        }
    }
   ]
}

任何建议将不胜感激。

【问题讨论】:

  • 能否请您也添加一个数据示例?很棒的是来自jsonschema.dev 的共享链接,也请描述子模式中不起作用的内容
  • 能否提供您期望有效和无效的实例数据?
  • (请注意jsonschema.dev目前只支持draft-07)
  • 编辑了描述。你能再看看吗?
  • anyOf 中有一个"$ref": "#/definitions/zoo_animal_id" 似乎不存在,也许你想在这里使用#/definitions/animal_id

标签: json validation jsonschema json-schema-validator


【解决方案1】:

就我可以解释您的架构而言,您似乎想在最后使用组合架构,而不是在同一项目部分中使用 ref

有了这个allOf,架构需要是一个有效的对象,就像items中定义的那样,就像definitions中的ref一样

另外一个错误来自使用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"
      }
    }
  ]
}

【讨论】:

  • 感谢您的回答。很抱歉这么说,但问题仍然存在。如果我在 zoo_list 中给出 "zoo_bird_id": "" (由于注释部分,此处跳过其余代码)。架构未验证“zoo_bird_id”。
猜你喜欢
  • 2018-06-04
  • 2019-12-14
  • 2022-01-02
  • 2011-06-08
  • 2015-07-18
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多