Подтвердить что ты не робот

Настройка, требуемая для массива json-schema

Я пытаюсь выяснить, как установить required в моем массиве объектов json-schema. Требуемое свойство отлично работает на объекте, а не массиве.

Вот часть моей схемы json:

        "items": {
        "type": "array",
        "properties": {
            "item_id": {"type" : "number"},
            "quantity": {"type": "number"},
            "price": {"type" : "decimal"},
            "title": {"type": "string"},
            "description": {"type": "string"}
        },
        "required": ["item_id","quantity","price","title","description"],
        "additionalProperties" : false
    }

Вот массив json, который я отправляю. Проверка json должна завершиться неудачей, так как я не передаю описание в этих элементах.

       "items": [
        {
            "item_id": 1,
            "quantity": 3,
            "price": 30,
            "title": "item1 new name"
        },
        {
            "item_id": 1,
            "quantity": 16,
            "price": 30,
            "title": "Test Two"
        }
    ]
4b9b3361

Ответ 1

Я получил его для работы с этим валидатором, вставив часть схемы для элементов массива внутри объекта с именем items. Теперь схема имеет два вложенных поля items, но это потому, что одно из них является ключевым словом в JSONSchema, а другое потому, что у вашего JSON есть поле с именем items

JSONSchema:

{
   "type":"object",
   "properties":{
      "items":{
         "type":"array",
         "items":{
            "properties":{
               "item_id":{
                  "type":"number"
               },
               "quantity":{
                  "type":"number"
               },
               "price":{
                  "type":"number"
               },
               "title":{
                  "type":"string"
               },
               "description":{
                  "type":"string"
               }
            },
            "required":[
               "item_id",
               "quantity",
               "price",
               "title",
               "description"
            ],
            "additionalProperties":false
         }
      }
   }
}

JSON:

{
   "items":[
      {
         "item_id":1,
         "quantity":3,
         "price":30,
         "title":"item1 new name"
      },
      {
         "item_id":1,
         "quantity":16,
         "price":30,
         "title":"Test Two"
      }
   ]
}

Вывод с двумя ошибками в отношении отсутствующих полей описания:

[ {
  "level" : "error",
  "schema" : {
    "loadingURI" : "#",
    "pointer" : "/properties/items/items"
  },
  "instance" : {
    "pointer" : "/items/0"
  },
  "domain" : "validation",
  "keyword" : "required",
  "message" : "missing required property(ies)",
  "required" : [ "description", "item_id", "price", "quantity", "title" ],
  "missing" : [ "description" ]
}, {
  "level" : "error",
  "schema" : {
    "loadingURI" : "#",
    "pointer" : "/properties/items/items"
  },
  "instance" : {
    "pointer" : "/items/1"
  },
  "domain" : "validation",
  "keyword" : "required",
  "message" : "missing required property(ies)",
  "required" : [ "description", "item_id", "price", "quantity", "title" ],
  "missing" : [ "description" ]
} ]

Попробуйте вставить выше в здесь, чтобы увидеть тот же результат, сгенерированный.

Ответ 2

Может быть, ваш валидатор поддерживает только JSONSchema v3?

Режим required работает с изменением между v3 и v4:

Ответ 3

Я понимаю, что это старая нить, но поскольку этот вопрос связан с jsonschema.net, я подумал, что это может стоить...

Проблема с вашим исходным примером заключается в том, что вы объявляете "свойства" типа "массив", а не объявляете "элементы" для массива, а затем объявляете тип "объект" (с "свойствами" ), который заполняет массив. Здесь пересмотренный вариант исходного фрагмента схемы:

"items": {
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "item_id": {"type" : "number"},
            "quantity": {"type": "number"},
            "price": {"type" : "decimal"},
            "title": {"type": "string"},
            "description": {"type": "string"}
        },
        "required": ["item_id","quantity","price","title","description"],
        "additionalProperties" : false
    }
}

Я бы рекомендовал не использовать термин "элементы" для имени массива, чтобы избежать путаницы, но там ничего не мешает вам сделать это...