jsonSchema для проверки условно обязательных атрибутов - PullRequest
0 голосов
/ 02 июля 2019

Моя полезная нагрузка JSON содержит два атрибута home_number, home_name и , по крайней мере один атрибут всегда требуется .Кроме того, эти атрибуты имеют следующие дополнительные ограничения:

home_number: тип: строка, максимальная длина: 4

home_name: тип: строка, максимальная длина: 50

Схема JSON должна выдавать ошибку , если оба атрибута не удовлетворяют требованиям .

например:

действительный JSON

{
    "home_number": "1234", // valid
}

действительный JSON

{
    "home_number": null, // invalid
    "home_name": "test_home_name" // valid
}

недействительный JSON

{
    "home_number": "12345", // invalid
    "home_name": null // invalid
}

Я пыталсяследующая схема JSON с draft-07 версией, использующей если, тогда ключевые слова.

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "address": {
            "$ref": "#/definitions/address",
            "properties": {
                "house_number": {
                    "$ref": "#/definitions/address/house_number"
                },
                "house_name": {
                    "$ref": "#/definitions/address/house_name"
                },
                "post_code": {
                    "$ref": "#/definitions/address/postcode"
                }
            }
        }
    },
    "required": [
        "address"
    ],
    "definitions": {
        "address": {
            "type": "object",
            "properties": {
                "postcode": {
                    "type": "string",
                    "maxLength": 6
                }
            },
            "anyOf": [
                {
                    "required": [
                        "house_number"
                    ]
                },
                {
                    "required": [
                        "house_name"
                    ]
                }
            ],
            "if": {
                "properties": {
                    "house_name": {
                        "not": {
                            "type": "string",
                            "maxLength": 50
                        }
                    }
                }
            },
            "then": {
                "properties": {
                    "house_number": {
                        "type": "string",
                        "maxLength": 4
                    }
                }
            },
            "required": [
                "postcode"
            ]
        }
    }
}

Мой вопрос, есть ли другой / лучший подход для достижения этой цели с использованием draft-04 версии без использования draft-07 если тогда ключевые слова?

1 Ответ

0 голосов
/ 19 июля 2019

Как отмечается в комментариях, возможно, об этом спрашивали несколько раз.

Использование логических операторов дает примеры трюка, схемы и json ниже. Я не могу сказать, лучше это или нет, он просто группирует что-либо в пределах «anyOf» (и требование почтового индекса вы можете добавлять всякий раз, когда вам нужно, и вы можете структурировать ссылки на полные «свойства» внутри, как вы хотите и т. Д. И т. Д. И т. Д.). .). Или вы можете указать его как XOR "oneOf" (также как указано в комментариях) и убедиться, что определение address-> properties для каждого случая сформировано так, как вам нужно.

Пожалуйста, прочитайте (ссылка на мой собственный ответ из прошлого не классная, но может привести к дальнейшему прочтению): Условная схема JSON: требовать и не требовать

Упрощенная схема и примеры для вашего вопроса (как я понял):

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties" : {
    "address": {
      "type" : "object",
      "anyOf" : [
        { 
          "properties" : {
            "house_number" : {
              "type":"string",
              "maxLength": 4
            },
          },
          "required":["house_number"]
        },
        { 
          properties : {
            "house_name" : {
              "type" : "string",
                "maxLength" : 50
            }
          },
          "required":["house_name"]
        }
      ]
    }
  },
  required: ["address"],
  examples : [
    {
      baddress: {
      }
    },
    {
      address: {
        "house_number":"1234",
        "house_name" : null
      }
    },
    {
      address: {
        "house_number":null,
        "house_name" : null
      }
    },
    {
      address: {
        "house_number":null,
        "house_name" : "some name"
      }
    },
    {
      address: {
        "house_number": "12345",
        "house_name" : "some afafafasagagagffgfsagragsgasgasssssssfdgsdfgsdfgdsgsdfgsdgsdfgdfsgsdfgs name"
      }
    },
  ]
}
...