2015-05-18 4 views
1

Ниже приведена действующая схема JSON в соответствии с http://jsonlint.com/ и http://jsonschemalint.com/draft4/#.Схема JSON - как использовать oneOf

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["results"], 
    "additionalProperties": false, 
    "properties": { 
     "results": { 
      "type": "string", 
      "oneOf": [ 
       { "result": "1" }, 
       { "result": "2" }, 
       { "result": "3" }, 
       { "result": "4" } 
      ] 
     } 
    } 
} 

Следующая JSON сообщает об ошибке (results is the wrong type) при сверяются вышеприведенной схеме:

{ 
    "results" : { 
     "result": "1" 
    } 
} 

Может кто-нибудь подскажет, как я мог бы решить эту ошибку?

+0

работает для меня Agains валидатор http://s4.postimg.org/dysqmvn4t/Screen_Shot_2015_05_18_at_10_52_08.png –

+0

То, что я хочу сказать, что JSON является действительным, но не соответствует схеме. Вы говорите иначе? – ksl

ответ

2

results - это тип object согласно вашему определению схемы, но вы упомянули тип как String. Если я изменю тип как object, он просто отлично работает.

+0

Этот ответ фиксирует сообщение об ошибке, но использование 'oneOf' также неверно. Только с этим изменением значение 'result' на самом деле не будет ограничено 1-4. – Jason

8

Похоже, что вы хотите в этом случае enum, а не oneOf. Вот как вы могли бы определить свою схему.

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["results"], 
    "additionalProperties": false, 
    "properties": { 
    "results": { 
     "type": "object", 
     "properties": { 
     "result": { 
      "type": "string", 
      "enum": ["1", "2", "3", "4"] 
     } 
     } 
    } 
    } 
} 

Но вопрос в том, как использовать oneOf правильно. Ключевое слово oneOf должно быть массивом схем, а не значений, которые вы использовали в вашем примере. Одна и только одна из схем в oneOf должна проверять данные для предложения oneOf для проверки. Мне нужно немного изменить ваш пример, чтобы проиллюстрировать, как использовать oneOf. Этот пример позволяет result быть строкой или целым числом.

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["results"], 
    "additionalProperties": false, 
    "properties": { 
    "results": { 
     "type": "object", 
     "properties": { 
     "result": { 
      "oneOf": [ 
      { 
       "type": "string", 
       "enum": ["1", "2", "3", "4"] 
      }, 
      { 
       "type": "integer", 
       "minimum": 1, 
       "maximum": 4 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
Смежные вопросы