Ошибка проверки схемы AJV

У меня есть ввод json, как показано ниже,

{"contents":[{"type":"field"},{"type":"field","itemId":"594b9980e52b5b0768afc4e8"}]}

условие: если тип — «поле», то «itemId» должно быть обязательным полем, а если тип — «fieldGroup» или «subSection», то «itemId» является необязательным.

Это схема Json, которую я пробовал, и она не работает должным образом,

"type": "object",
"additionalProperties": false,
"properties" : {
    "contents" : {
        "type" : "array",
        "items": {"$ref": "#displayItem" }
    }
},
"definitions": {
    "displayItem" : {
        "id": "#displayItem",
        "type": "object",
        "items": {
            "anyOf": [
                {"$ref": "#fieldType"},
                {"$ref": "#fieldGroupSubSectionType"}
            ]
        }
    },

    "fieldType" : {

        "id": "#fieldType",
        "type": "object",
        "additionalProperties": false,
        "properties": {
            "itemId": {
                "type": "string"
            },
            "type": {
                "type": "string",
                "enum": ["field"]
            }
        }

    },

    "fieldGroupSubSectionType" : {

        "id": "#fieldGroupSubSectionType",
        "type": "object",
        "additionalProperties": false,
        "properties": {
            "itemId": {
                "type": [ "string", "null" ]
            },
            "type": {
                "type": "string",
                "enum": [
                    "fieldGroup",
                    "subSection"
                ]
            }
        }

    }
}

Любая помощь/обходной путь с образцом схемы Json для достижения вышеуказанного варианта использования приветствуется.


person Ragubathy    schedule 22.06.2017    source источник


Ответы (2)


Если я правильно понимаю описание того, что вы хотите, то приведенный вами пример json недействителен, поскольку он имеет тип: «поле», но не имеет свойства «itemId».

Предположим, что это правда. Вместо использования

тип: ["строка", ноль]

используйте свойство required.

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

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "contents": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "itemId": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "field"
                ]
              }
            },
            "required": [
              "itemId"
            ]
          },
          {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "itemId": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "fieldGroup",
                  "subSection"
                ]
              }
            }
          }
        ]
      }
    }
  }
}
person Pedro    schedule 22.06.2017

Вот ваш ответ с небольшой очисткой для лучших практик и стиля. Хитрость в том, что вам нужно использовать импликацию «a подразумевает b ‹=> (не a) или b». В этом случае у вас есть «тип = поле подразумевает, что itemId требуется ‹ => тип не является полем или требуется itemId».

{
  "type": "object",
  "properties": {
    "contents": {
      "type": "array",
      "items": { "$ref": "#/definitions/displayItem" }
    }
  },
  "definitions": {
    "displayItem": {
      "type": "object",
      "properties": {
        "itemId": { "type": "string" },
        "type": { "enum": ["field", "fieldGroup", "subSection"] }
      },
      "anyOf": [
        { "not": { "$ref": "#/definitions/fieldType" } },
        { "required": ["itemId"] }
      ]
    },
    "fieldType": {
      "properties": {
        "type": { "enum": ["field"] }
      }
    }
  }
}
person Jason Desrosiers    schedule 23.06.2017