Схема JSON, если / тогда требуется вложенный объект - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть JSON:

{
    "i0": {
        "j0": {
            "a0": true
        }
    },
    "i1": {
        "j1": {
            "a1": "stuff"
        }
    }
}

Я хочу подтверждение: если a0 истинно, необходимо a1.

Моя схема в настоящее время:

{
    "$schema": "http://json-schema.org/draft-07/schema",
    "id": "id",
    "type": "object",
    "required": [
        "i0",
        "i1"
    ],
    "allOf": [
        {
            "if": {
                "properties": {
                    "i0": {
                        "j0": {
                            "a0": true
                        }
                    }
                }
            },
            "then": {
                "properties": {
                    "i1": {
                        "j1": {
                            "required": [
                                "a1"
                            ]
                        }
                    }
                }
            }
        }
    ]
}

Кажется, что это условие на самом деле не выполняется.Кроме того, я видел, как получилось очень похожее условие для работы, если я попытался поставить required на тот же уровень, что и проверяемое мной значение.Как в:

"allOf": [
    {
        "if": {
            "a0": true
        },
        "then": {
            "required": [
                "a1"
            ]
        }
    }
]

, но для этого нужно, чтобы a1 был ниже j0 вместе с a1.Как мне потребовать объект в j1 на основе значения в j0?

1 Ответ

0 голосов
/ 07 февраля 2019

Попробуйте:

{
  "if":{
    "type":"object",
    "properties":{
      "i0":{
        "type":"object",
        "properties":{
          "j0":{
            "type":"object",
            "required":["a0"]
          }
        },
        "required":["j0"]
      }
    },
    "required":["i0"]
  },
  "then":{
    "type":"object",
    "properties":{
      "i1":{
        "type":"object",
        "properties":{
          "j1":{
            "type":"object",
            "required":["a1"]
          }
        },
        "required":["j1"]
      }
    },
    "required":["i1"]
  }
}

Вы должны использовать общую структуру в ключевых словах if / then, начиная с любого общего корня.В этом случае их пути начинают расходиться в свойстве i0 / i1, поэтому вам необходимо включить всю структуру с этой точки.

Ключевые слова type гарантируют, что у вас есть объект,в противном случае схема может пройти проверку при использовании других типов, таких как string s или boolean s.

Ключевые слова required гарантируют, что подсхемы if / then соответствуют только объектамкоторые на самом деле содержат пути свойств i0.j0.a0 / i1.j1.a1 соответственно.

Кроме того, ключевые слова required для свойств a0 / `a1 только указывают, что они существуют .Вы можете добавить дополнительную проверку к этой подсхеме, если вам это нужно.

...