Нужны ли схемы JSON для определения структуры JSON?

Я спрашиваю об этом, потому что вижу, что текущий черновик схемы JSON (http://json-schema.org/ ) предлагает схему JSON следующим образом:

для JSON:

{
 "a":"abc"
 "b": 123
}

схема, предложенная в черновике, похожа на

{
 "type":"object"
 "properties":{
  "a": {"type":"string"}
  "b": {"type":"integer"}
 }
}

У меня вопрос: не определяет ли сам JSON свою структуру? Нужна ли отдельная схема?

Схема, предложенная в черновике, проверяет JSON, который имеет указанную выше структуру, и эти JSON всегда имеют формат

{
 "a":"string"
 "b": 1 (or some number)
}

Так зачем нужна отдельная схема для JSON. Мы можем просто использовать JSON для определения его структуры.

PS. Я знаю, что мы можем указать некоторые ограничения на значения, которые JSON может принимать через схемы, предложенные в черновике, но с точки зрения определения структуры JSON необходимы ли предлагаемые схемы?


person glugglug    schedule 24.06.2014    source источник


Ответы (2)


Сам JSON не определяет структуру. Например, я мог бы написать:

{
  "a": "string",
  "b": "another string"
}

Это также действительный JSON, но это JSON с «другой структурой», потому что "b" теперь является строкой. Но ваш API может принимать только JSON с определенной структурой, поэтому, хотя это действительный JSON, это не та форма, которая вам нужна.

Теперь вам нужна схема JSON для определения структуры ваших данных JSON? Нет, вы могли бы вместо этого сказать:

Значение должно быть объектом. У него должно быть два свойства:

  • "a" - должен быть строкой
  • "b" - должно быть целым числом

Программист мог понять это очень легко, без фигурных скобок или чего-то подобного.

Однако есть преимущества в наличии машиночитаемого описания формата, поскольку оно позволяет автоматизировать различные вещи (например, тестирование, создание документации, создание кода / классов и т. Д.)


Изменить: Как указано в комментариях, вы можете взять информацию о типе из некоторых примеров данных и использовать ее в качестве модели для других данных. В этом случае вы в основном используете данные из вашего примера как супер-базовую схему.

Для очень простых ограничений (базовый тип) это работает. Однако как бы вы сказали, что "b" должно быть целым числом, а не числом с плавающей запятой? Как сказать, что "b" должно быть> 0? Как сказать, что "a" не может быть пустой строкой ("")?

Действительно, существуют инструменты, которые генерируют базовую схему JSON из данных примера, однако результирующая схема обычно требует небольшой настройки, чтобы фактически описать формат (например, min / max, обязательные / необязательные свойства и т. Д.).

person cloudfeet    schedule 26.06.2014
comment
но глядя на JSON, тип количества можно вывести. Таким образом, я могу сказать, что сам экземпляр JSON содержит информацию о типе и структуре. - person glugglug; 30.06.2014
comment
Тип можно определить следующим образом: 1. Если значение заключено в кавычки, это строка (abc) 2. Если значение равно true / false (без кавычек), то это логическое значение 3. Если это null (без кавычек), тогда он представляет собой null 4. Если это число / десятичное (без кавычек), то это числовой тип. - person glugglug; 30.06.2014
comment
Ах, верно - значит, вы говорите о проверке на примере данных, а не на схеме? Достаточно справедливо - хотя как вы отличите целое число от числа с плавающей запятой или укажите минимальную длину строк и т. Д.? - person cloudfeet; 30.06.2014
comment
Добавлен раздел в ответ. - person cloudfeet; 30.06.2014
comment
Да, я согласен с тем, что если необходимо указать дополнительные ограничения, такие как длина строки или регулярные выражения, которые должны совпадать и т. Д., Необходимы схемы JSON. Но если для меня важна только информация о типе и структуре, я могу использовать сам экземпляр в качестве схемы, верно? - person glugglug; 01.07.2014
comment
Конечно - если вам не нужно различать целые числа и числа, указывать обязательные / необязательные и т. Д., Тогда вы можете просто использовать пример экземпляра вместо схемы. Если бы заголовок был Необходима ли схема JSON, если мне нужно сказать только этот конкретный ограниченный набор вещей, тогда ответ будет отрицательным, но заголовок не очень конкретен, и такие вещи, как обязательные / необязательные и целочисленные / число - довольно распространенные ограничения. - person cloudfeet; 02.07.2014

До сих пор в этом никогда не было необходимости, и в краткосрочной перспективе я не думаю, что это произойдет.

Мне лично нравится JSON за его простоту, портативность и гибкость.

Я не вижу даже крупных брендов, использующих эту схему, поэтому до сих пор они не воспринимали ее всерьез.

person Quijote Shin    schedule 24.06.2014
comment
Считаете ли вы Heroku крупным брендом? :п - person cloudfeet; 26.06.2014
comment
Как насчет Google (хотя они используют v3)? Они также используют схему JSON для некоторых внутренних вещей в Chrome. - person cloudfeet; 26.06.2014
comment
в этом случае пришло время взглянуть на схемы, говоря об API. Хорошей практикой является определение ваших сущностей. - person Quijote Shin; 26.06.2014
comment
@cloudfeet, можете ли вы дать мне еще несколько известных вам систем, использующих схемы JSON, чтобы я мог видеть, что они предоставляют. Заранее спасибо! - person glugglug; 01.07.2014