JSON не проходит проверку на основе схемы - PullRequest
0 голосов
/ 04 октября 2019

Я должен что-то здесь упустить, но приведенный ниже JSON не проверяется на соответствие схеме. Например, обязательный атрибут из объекта Java / JavaScript никогда не применяется в соответствии со схемой. (К сведению. Каждый языковой объект может иметь другие атрибуты или вложенный объект)

Однако, если я полностью удаляю определение и непосредственно помещаю его в элементы массива по отдельности, то он проверяется.

Я хочу использовать «определения» и получить подтверждение. Причина, по которой я должен поместить все объекты в определения, и позже мне, возможно, придется поместить другой объект языка в oneOf / allOf для другой определенной проверки проверки.

Онлайн проверка: Схема и JSON

JSON

{
  "languages": [
    {
      "lang": "Java",
      "trainer": "Peter"
    },
    {
      "lang": "JavaScript",
      "enrolled": "42",
      "available": "5"
    }
  ]
}

и Схема

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "languages"
  ],
  "properties": {
    "languages": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object"
      },
      "anyOf": [
        {
          "$ref": "#/definitions/Java"
        },
        {
          "$ref": "#/definitions/JavaScript"
        }
      ]
    }
  },
  "definitions": {
    "Java": {
      "required": [
        "trainer"
      ],
      "properties": {
        "lang": {
          "enum": [
            "Java"
          ]
        },
        "trainer": {
          "type": "string"
        }
      }
    },
    "JavaScript": {
      "required": [
        "enrolled",
        "available"
      ],
      "properties": {
        "lang": {
          "enum": [
            "JavaScript"
          ]
        },
        "enrolled": {
          "type": "string"
        },
        "available": {
          "type": "string"
        }
      }
    }
  }
}

Фиксированная схема и все работаетсейчас

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "languages"
  ],
  "properties": {
    "languages": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "anyOf": [
          {
            "$ref": "#/definitions/Java"
          },
          {
            "$ref": "#/definitions/JavaScript"
          }
        ]
      }
    }
  },
  "definitions": {
    "Java": {
      "required": [
        "trainer"
      ],
      "properties": {
        "lang": {
          "enum": [
            "Java"
          ]
        },
        "trainer": {
          "type": "string"
        }
      }
    },
    "JavaScript": {
      "required": [
        "enrolled",
        "available"
      ],
      "properties": {
        "lang": {
          "enum": [
            "JavaScript"
          ]
        },
        "enrolled": {
          "type": "string"
        },
        "available": {
          "type": "string"
        }
      }
    }
  }
}

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Я думаю, что определение "массива" неверно. Объекты, которые могут быть добавлены в массив, должны указываться в «элементах» после определения типа элементов. Как то так:

"languages": {
        "type": "array",
        "minItems": 1,
        "items": {
            "type": "object",
            "anyOf": [
                {"$ref": "#/definitions/Java"},
                {"$ref": "#/definitions/JavaScript"}
            ]
        }
    }
0 голосов
/ 04 октября 2019

Я исправил себя

Что я сделал: я поместил объектные блоки json в секцию items массива.

...