иерархия родитель / ребенок & jsonschema - PullRequest
1 голос
/ 01 февраля 2020

Я пытаюсь придумать схему json для проверки документов такого типа:

 {
  "rootData": {
    "parent1": [
      {
        "parent1": [
          {
            "leaf1": {
              "attr": "value"
            }
          }
        ]
      },
      {
        "parent2": [
          {
            "leaf1": {
              "attr": "value"
            }
          }
        ]
      },
      {
        "leaf1": {
          "attr": "value"
        }
      }
    ]
  },
  "rootInfo": {
    "i1": 1
  }
 }

Некоторая информация:

  1. "rootData" может содержать только один родитель, либо parent1, либо parent2
  2. parent1 / parent2 может быть переключен на parent2 / parent1 в любой позиции в иерархии
  3. без ограничения глубины: до тех пор, пока родитель содержит другого родителя, мы можем go глубже и глубже.

Мне кажется, я смог понять, как представить иерархическую природу встроенной родительской / дочерней части. Но я не знаю, как определить верхний уровень «rootData», точнее выбор между «parent1» или «parent2», так как я не могу использовать oneOf (я думаю ...)

    {
  "$schema": "http://json-schema.org/draft-06/schema#",
  "definitions": {
    "parent1": {
      "$id": "#parent1",
      "type": "object",
      "properties": {
        "parent1": {
          "$ref": "#node"
        }
      }
    },
    "parent2": {
      "$id": "#parent2",
      "type": "object",
      "properties": {
        "parent2": {
          "$ref": "#node"
        }
      }
    },
    "leaf1": {
      "$id": "#leaf1",
      "type": "object",
      "properties": {
        "leaf1": {
          "type": "object",
          "properties": {
            "attr": {
              "type": "string"
            }
          },
          "required": [
            "attr"
          ]
        }
      }
    },
    "node": {
      "$id": "#node",
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "#parent1"
          },
          {
            "$ref": "#parent2"
          },
          {
            "$ref": "#leaf1"
          }
        ]
      }
    }
  },
  "type": "object",
  "properties": {
    "rootData": {
      "properties": {
        //I tried several things here minProperties/maxProperties or oneOf ... but I actually don't know how to reuse my previous parent1 or parent2 definitions ...
        }
    }
  }
}

Любая помощь приветствуется!

Thx

1 Ответ

0 голосов
/ 02 февраля 2020

Добавьте ограничения "required":["parent1"] и "required":["parent2"] к определениям parent1 и parent2 и используйте oneOf:

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "definitions": {
        "parent1": {
            "$id": "#parent1",
            "type": "object",
            "required": ["parent1"],
            "properties": {
                "parent1": {"$ref": "#node"}
            }
        },
        // ...
    },
    "type": "object",
    "properties": {
        "rootData": {
            "oneOf": [
                {"$ref": "#parent1"},
                {"$ref": "#parent2"}
            ]
        }
    }
}

Если вы попытались использовать anyOf, и это сработало, то это потому, что ваш parent1 и parent2 определения проверяют друг друга: parent1 проверяет соответствие parent2 объекту, так как он игнорирует свойство parent2 и допустим без свойства parent1; и наоборот для «parent1».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...