Json схема не проверяется / работает с подчиненной схемой - PullRequest
0 голосов
/ 13 марта 2020

У меня json показано ниже. Я хочу, чтобы это работало со списком зоопарка, который должен иметь zoo_unique_code. Но может быть животное или птица или оба или ни один из них. Но я хочу проверить это с помощью схемы, если в ней есть животное или птица, например, 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 голосов
/ 13 марта 2020

Насколько я могу интерпретировать вашу схему, кажется, что вы хотите использовать комбинированную схему в конце, вместо того, чтобы иметь ref в той же части элементов.

С этим allOf схема должна быть действительным объектом, как определено в items и как ref в definitions

Также другая ошибка возникает при использовании anyOf вместо allOf.

При anyOf он должен быть действителен как для первой, так и для второй схем, поскольку обе проверяются для объекта, даже если первая недействительна, вторая действительна, поэтому все допустимо. Это также может быть изменено с помощью additionalProperties, но тогда оно не будет работать так, как вы его вложили.

anyOf: пока значение проверяется по любой из этих схем, оно считается действует против всей объединенной схемы. - combining-schemas

Вы также хотели бы использовать allOf здесь, поэтому оно должно проверяться на всех или переписать это условие, чтобы не использовать объект здесь.

С этой модификацией anyOf в allOf ваши данные теперь также проверяют 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"
          }
        ]
      }
    }
  }
}

Недопустимые данные, см .: неверные :

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

Допустимые данные, см. действительные :

{
  "zoo_list": [
    {
      "zoo_unique_code": "NEWYORKZOO",
      "zoo_bird": {
        "zoo_bird_id": "newid"
      }
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...