Условная проверка в схеме JSON - PullRequest
0 голосов
/ 24 сентября 2019

У меня следующая схема JSON:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "Payload": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "Person": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                            "Id": {
                                "type": "string"
                            },
                            "Name": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "Id",
                            "Name"
                        ]
                    }
                }
            }
        },
        "Reference": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "Status": {
                    "anyOf": [
                        {
                            "Passed": {
                                "type": "string"
                            },
                            "Failed": {
                                "type": "string"
                            }
                        }
                    ]
                }
            }
        }
    },
    "anyOf": [
        {
            "additionalProperties": false,
            "properties": {
                "Status": {
                    "type": "string",
                    "enum": [
                        "Failed"
                    ]
                }
            },
            "required": [
                "Reference"
            ],
            "not": {
                "required": [
                    "Payload"
                ]
            }
        },
        {
            "additionalProperties": true,
            "properties": {
                "Status": {
                    "type": "string",
                    "enum": [
                        "Passed"
                    ]
                }
            },
            "required": [
                "Reference"
            ]
        }
    ]
}

Я хочу проверить, если сообщение JSON не имеет статуса, тогда массив персон не должен присутствовать.Он должен присутствовать только в том случае, если статус передан.

Я пытался следовать решению здесь , но определенно я делаю что-то не так, поскольку валидатор проходит с состоянием Failed и личными данными.Может кто-нибудь сказать, что я могу делать не так?

1 Ответ

1 голос
/ 25 сентября 2019

У вас есть несколько проблем.

/ properties / Reference / properties / Status

Это недопустимая схема.Похоже, вы пытаетесь описать перечисление.

AdditionalProperties

Причина сложна, но условные шаблоны не работают с additionalProperties.Хорошая новость в том, что это также не нужно.Вы можете просто пропустить их.

/ anyOf

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

Условно для вложенного свойства

Ваши схемы, которые определяют значение Reference.Status, на самом деле просто указывают на Status.Вам нужна схема, которая также описывает родительское свойство.


Следующее делает то, что я думаю, ваша схема пыталась сделать.

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "Payload": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "Person": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "Id": { "type": "string" },
              "Name": { "type": "string" }
            },
            "required": ["Id", "Name"]
          }
        }
      }
    },
    "Reference": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "Status": { "enum": ["Passed", "Failed"] }
      }
    }
  },
  "anyOf": [
    {
      "not": {
        "properties": {
          "Reference": {
            "properties": {
              "Status": { "enum": ["Failed"] }
            },
            "required": ["Status"]
          }
        },
        "required": ["Reference"]
      }
    },
    { "not": { "required": ["Payload"] } }
  ]
}
...