Схема JSON: используйте значение поля в качестве обязательного имени поля - PullRequest
0 голосов
/ 04 июля 2019

Мне нужно определить схему JSON для JSON, в которой поле / ключ вызывается как значение предыдущего поля. Примеры:

{
  "key1": "SOME_VALUE",
  "SOME_VALUE": "..."
}
{
  "key1": "ANOTHER_VALUE",
  "ANOTHER_VALUE": "..."
}

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

Спасибо за помощь

Ответы [ 2 ]

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

Итак, благодаря Relequestual предложениям мне удалось найти решение.

Ограничение: возможные значения «key1» должны быть конечными и известными заранее

Предположим, нам нужна схема JSON для проверки JSON, которая:

  1. Требуются строковые свойства "required_simple_property1" и "required_simple_property2".
  2. Требуется свойство "key1" в виде перечисления с 3 возможными значениями ["value1", "value2", "value3"].
  3. Требуется третье свойство, ключом которого должно быть значение, принятое key1.

Это может быть достигнуто с помощью такой схемы:

"oneOf": [
    {
        "required": [
            "required_simple_property1",
            "required_simple_property2",
            "value1"
        ],
        "properties": {
            "key1": {
                "type": "string",
                "const": "value1"
            }
        } 
    },
    {
        "required": [
            "required_simple_property1",
            "required_simple_property2",
            "value2"
        ],
        "properties": {
            "key1": {
                "type": "string",
                "const": "value2"
            }
        } 
    },
    {
        "required": [
            "required_simple_property1",
            "required_simple_property2",
            "value3"
        ],
        "properties": {
            "key1": {
                "type": "string",
                "const": "value3"
            }
        } 
    }
],
"properties": {
    "required_simple_property1": {
        "type": "string"
    },
    "required_simple_property2": {
        "type": "string"
    },
    "value1": {
        ... (anything)
    },
    "value2": {
        ... (anything)
    },
    "value3": {
        ... (anything)
    },
}
0 голосов
/ 04 июля 2019

Единственный способ сделать это, если вы знали значения заранее, но, похоже, это невозможно для вас. Это должно быть в вашей проверке бизнес-логики, а не в проверке формата.

...