Проблема со схемой JSON Enum — исправьте меня с действительной схемой

У меня есть следующая полезная нагрузка JSON, где я пытаюсь добавить значение типа ENUM для одного из элементов.

{
  "firstName" : "firstName",
  "lastName" : "lastName",
  "systemIds" : [ {
    "systemName" : "SAP",
    "systemId" : "99c27c63-e0b6-4585-8675-7aa3811eb4c3"
  }, {
    "systemName" : "SFDC",
    "systemId" : "b65abf1d-825d-4ee3-9791-02d2cdd5e6f4"
  }, {
    "systemName" : "MONGODB",
    "systemId" : "18e50430-8589-42d6-8477-58839a8bf202"
  } ]
}

А вот моя схема, которую я пытался изменить после того, как она была автоматически сгенерирована с помощью этого веб-сайта. http://jsonschema.net/#/

Я добавил вручную типы ENUM в соответствии с моими ожиданиями здесь. Пожалуйста, исправьте, что не так с этой СХЕМОЙ.

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://abcd.com/schemas/customerInfo",
  "type": "object",
  "properties": {
    "firstName": {
      "id": "http://abcd.com/schemas/customerInfo/firstName",
      "type": "string"
    },
    "lastName": {
      "id": "http://abcd.com/schemas/customerInfo/lastName",
      "type": "string"
    },
    "systemIds": {
      "id": "http://abcd.com/schemas/customerInfo/systemIds",
      "type": "array",
      "minItems": 1,
      "uniqueItems": false,
      "additionalItems": true,
      "items": {
        "anyOf": [
          {
            "id": "http://abcd.com/schemas/customerInfo/systemIds/0",
            "type": "object",
            "properties": {
              "systemName": {
                "id": "http://abcd.com/schemas/customerInfo/systemIds/0/systemName",
                "type": { "enum": [ "SAP", "MONGODB", "ERP", "SFDC" ] }
              },"required": ["type"],
              "systemId": {
                "id": "http://abcd.com/schemas/customerInfo/systemIds/0/systemId",
                "type": "string"
              }
            }
          }
        ]
      }
    }
  }
}

person devanand    schedule 31.03.2015    source источник
comment
Хорошо, что не так? Не заставляйте нас гадать.   -  person Jeff Mercado    schedule 31.03.2015
comment
Я не уверен, что здесь не так. Я новичок в создании схемы JSON, и я использовал эту ссылку для проверки этой схемы JSON - jsonschemalint.com/draft4/# это дает мне следующие ошибки. data.properties.* ссылочная схема не соответствует [object Object]   -  person devanand    schedule 31.03.2015


Ответы (1)


Схема для элементов массива выглядит неправильно.

{
  "anyOf": [
    {
      "id": "http://abcd.com/schemas/customerInfo/systemIds/0",
      "type": "object",
      "properties": {
        "systemName": {
          "id": "http://abcd.com/schemas/customerInfo/systemIds/0/systemName",
          "type": {
            "enum": [
              "SAP",
              "MONGODB",
              "ERP",
              "SFDC"
            ]
          }
        },
        "required": [
          "type"
        ],
        "systemId": {
          "id": "http://abcd.com/schemas/customerInfo/systemIds/0/systemId",
          "type": "string"
        }
      }
    }
  ]
}

Вы заявили, что должно быть свойство "required", но указали неверную схему. Это нужно убрать. Но, возможно, вы имели в виду, что свойство "type" где-то требуется и неуместно. Я не вижу никакого отношения.

Свойство "systemName" представляет собой строковый тип со значениями, которые должны находиться в этом перечислении. Схема там неверная.

Это должно сработать для вас:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://abcd.com/schemas/customerInfo",
  "type": "object",
  "properties": {
    "firstName": {
      "id": "http://abcd.com/schemas/customerInfo/firstName",
      "type": "string"
    },
    "lastName": {
      "id": "http://abcd.com/schemas/customerInfo/lastName",
      "type": "string"
    },
    "systemIds": {
      "id": "http://abcd.com/schemas/customerInfo/systemIds",
      "type": "array",
      "minItems": 1,
      "uniqueItems": false,
      "additionalItems": true,
      "items": {
        "anyOf": [
          {
            "id": "http://abcd.com/schemas/customerInfo/systemIds/0",
            "type": "object",
            "properties": {
              "systemName": {
                "id": "http://abcd.com/schemas/customerInfo/systemIds/0/systemName",
                "type": "string",
                "enum": [ "SAP", "MONGODB", "ERP", "SFDC" ]
              },
              "systemId": {
                "id": "http://abcd.com/schemas/customerInfo/systemIds/0/systemId",
                "type": "string"
              }
            }
          }
        ]
      }
    }
  }
}
person Jeff Mercado    schedule 31.03.2015
comment
Спасибо Джефф за исправление. И просто чтобы убедиться, что если я использую здесь anyOf, это означает, что любое из этих значений из списка ENUM я могу присвоить элементу systemName, верно? - person devanand; 31.03.2015
comment
Нет, используя здесь "anyOf", вы заявляете, что элементы массива могут быть любого типа в предоставленном массиве схем, независимо от индекса в массиве. С массивами вы можете контролировать, какие элементы появляются в каком индексе, но здесь это не используется. - person Jeff Mercado; 31.03.2015
comment
Я ищу правильное значение здесь тогда. Взгляните на мой запрос полезной нагрузки JSON как часть моего вопроса и тогда предложите мне правильное значение для него. - person devanand; 31.03.2015
comment
Схема хороша, но вам нужно избавиться от всех ложных id; эта схема не может использоваться повторно как таковая (другими схемами). Держите идентификатор только вверху. - person fge; 01.04.2015