2013-07-29 2 views
13

Я пытаюсь выяснить, как установить required в моем массиве объектов json-schema. Требуемое свойство отлично работает на объекте, а не на массиве.настройка, требуемая для массива 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" 
     } 
    ] 

ответ

15

Я получил его для работы с использованием this validator, вставив часть схемы для элементов массива внутри объекта с именем 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" ] 
} ] 

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

5

Возможно, ваш валидатор поддерживает только JSONSchema v3?

Путь required работы изменяется между v3 и v4:

+0

json-schema.org, похоже, использует v4. – ipengineer

4

Я понимаю, что это старая нить, но так как этот вопрос связан с 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 
    } 
} 

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

Смежные вопросы