2014-07-29 4 views
22

Я пытаюсь выяснить, как работает oneOf, создавая схему, которая проверяет два разных типа объектов. Например, человек (имя, фамилия, спорт) и транспортные средства (тип, стоимость).Пример Json Schema для объектов oneOf

Вот некоторые примеры объектов:

{"firstName":"John", "lastName":"Doe", "sport": "football"} 

{"vehicle":"car", "price":20000} 

Вопрос заключается в том, что я сделал неправильно и как я могу это исправить. Вот схема:

{ 
    "description": "schema validating people and vehicles", 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": [ "oneOf" ], 
    "properties": { "oneOf": [ 
     { 
      "firstName": {"type": "string"}, 
      "lastName": {"type": "string"}, 
      "sport": {"type": "string"} 
     }, 
     { 
      "vehicle": {"type": "string"}, 
      "price":{"type": "integer"} 
     } 
    ] 
    } 
} 

Когда я пытаюсь проверить его в этом парсер:

https://json-schema-validator.herokuapp.com/ 

Я получаю следующее сообщение об ошибке:

[ { 
    "level" : "fatal", 
    "message" : "invalid JSON Schema, cannot continue\nSyntax errors:\n[ {\n \"level\" : \"error\",\n \"schema\" : {\n \"loadingURI\" : \"#\",\n \"pointer\" : \"/properties/oneOf\"\n },\n \"domain\" : \"syntax\",\n \"message\" : \"JSON value is of type array, not a JSON Schema (expected an object)\",\n \"found\" : \"array\"\n} ]", 
    "info" : "other messages follow (if any)" 
}, { 
    "level" : "error", 
    "schema" : { 
    "loadingURI" : "#", 
    "pointer" : "/properties/oneOf" 
    }, 
    "domain" : "syntax", 
    "message" : "JSON value is of type array, not a JSON Schema (expected an object)", 
    "found" : "array" 
} ] 

ответ

33

Попробуйте это:

{ 
    "description" : "schema validating people and vehicles", 
    "type" : "object", 
    "oneOf" : [{ 
     "properties" : { 
      "firstName" : { 
       "type" : "string" 
      }, 
      "lastName" : { 
       "type" : "string" 
      }, 
      "sport" : { 
       "type" : "string" 
      } 
     }, 
     "required" : ["firstName"] 
    }, { 
     "properties" : { 
      "vehicle" : { 
       "type" : "string" 
      }, 
      "price" : { 
       "type" : "integer" 
      } 
     }, 
     "additionalProperties":false 
    } 
] 
} 
+1

Это сработало. Спасибо! – Bloodcount

+0

Помогает ли 'oneOf' в проверке запроса? Я не вижу никакой аннотации jackson для 'oneOf' во время преобразования pojo –

+0

@ gursahib.singh.sahni, то есть конкретной проблемы с Джексоном. Нелегко перевести одну семантику на некоторые языки программирования, такие как java. Вам нужны некоторые конструкции типа Disjoint, Discriminated Unions, Union Types ..., которые есть на других языках. – jruizaranguren

8

oneOf нужно использовать внутри a схема для работы.

Внутри свойства, это как другое свойство под названием «oneOf» без эффекта, который вы хотите.

+1

Я не говорю, что неправильно, но вы можете предоставить источник этой информации, пожалуйста? =] – Relequestual

+0

Ссылка на официальные документы будет принята с благодарностью. – Epoc

+0

Ну, это имеет смысл из-за дедукции того, что делает «свойства», т. Е. Почему «свойства» когда-либо делают специальный случай для ключей с именем «oneOf»? Довольно много здравого смысла это работает так, что я думаю об этом. Спасибо за объяснение. – dtgq

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