Должен ли JSON включать нулевые значения [закрыто]

Я создаю API, который возвращает результаты в виде JSON. Существуют ли в настоящее время лучшие рекомендации относительно того, должны ли мы включать ключи в результат, когда значение равно нулю? Например:

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}

или же

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}

Поскольку второе меньше, я склоняюсь к этому стилю, но я не уверен, есть ли предпочтительный стиль или нет. С точки зрения клиента кажется, что оба стиля будут функционально эквивалентны. Есть плюсы или минусы для каждого?

 Surya Pratap23 нояб. 2016 г., 13:07
Преимущество первого представления заключается в том, что схема объекта сохраняется, и наличие свойства не является неоднозначным на основе данных. во втором формате эта информация теряется. Спецификация JSON как таковая не требует ни формата AFAIK
 jjathman14 июл. 2015 г., 23:58
@ Jacob Хотя я не сказал этого, я собирался ответить на этот вопрос так: «полный» JSON, представляющий ответ, был возвращен. Когда клиент может предположить, что между этими двумя подходами нет функциональной разницы. Если бы API выборочно не возвращал ключи / значения, тогда да, было бы очень важно, какой подход был выбран.
 Jacob05 нояб. 2013 г., 22:21
На это невозможно ответить правильно. Правильный ответ зависит от требований приложения. ОП просто выбрал ответ, который соответствует его требованиям. Если ваше приложение должно уметь различать, знает ли "isbn" равно нулю против, если "isbn" возможно, не были отправлены с сервера по другой причине, вам нужно включить его.

Ответы на вопрос(5)

что нет разницы, когда вы используете JSON как данные, лежащие в основе пользовательского опыта.

Разница появляется в файлах конфигурации JSON, когда пользователь должен что-то редактировать вручную. Когда вы используете первый пример, вы даете пользователю подсказку о конфигурации.

 18 июн. 2015 г., 09:51
Не могли бы вы более подробно изложить свой ответ, добавив немного больше описания предлагаемого вами решения?

null а такжеundefined так как они имеют два разных значения в Javascript. Вы можете думать оnull как означающее свойство неизвестно или бессмысленно, иundefined что означает, что свойство не существует.

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

null означает что-то совсем другое, чемundefined.

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

 12 июн. 2012 г., 21:30
Нет & quot; неопределенного & quot; в JSON, поэтому я думаю, что он спрашивает только, стоит ли включать & quot; empty & quot; свойства или нет -{"prop":undefined} отличается от{}.
 12 июн. 2012 г., 21:32
Согласен, я пытаюсь объяснить, что на стороне получателя, если он ищет определенное свойство, которое должно быть установлено в нуль, оно не будет. Это будет неопределенным, если не учитывать.

При этом опущение свойства оставляет неоднозначность.

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

Следует также упомянуть, что функция hasOwnProperty в javascript дает вам дополнительную информацию.

/* if true object DOES contain the property with *some* value */
if( objectFromJSON.hasOwnProperty( "propertyName" ) )

/* if true object DOES contain the property and it has been set to null */
if( jsonObject.propertyName === null )

/* if true object either DOES NOT contain the property
   OR
   object DOES contain the property and it has been set to undefined */
if( jsonObject.propertyName === undefined )
 22 мая 2015 г., 09:37
точно первая часть принятого ответа так ошибочна ...
 21 нояб. 2013 г., 20:50
+1. Человек на другом конце (который написал код) будет лучше обслуживаться явными значениями. Они могут не писать JavaScript ;-)
 05 нояб. 2013 г., 22:20
Именно больше людей должны понимать разницу между & quot; & quot ;, null и undefined. Ответ на этот вопрос зависит от требований пользователей.
 30 дек. 2014 г., 20:44
Обратите внимание, что проверка на нулевое значение не работает с ==, === обязательна (поскольку undefined == нулевая)!
Решение Вопроса

но если бы это было проблемой, вы бы также использовали индексированные массивы вместо заполнения JSON ключами. Очевидно, что["Foo Bar","Joe Blow"] намного короче, чем у вас сейчас.

С точки зрения удобства использования, я не думаю, что это имеет какое-либо значение. В обоих случаях,if(json.isbn) перейдем кelse, Обычно нет необходимости различатьnull (без значения) иundefined (без заданного значения).

 22 мая 2015 г., 09:35
Я бы на самом деле -1 это для "quot; обычно нет необходимости различать ноль" если бы у меня была репутация Из двух причин: 1. причины различения существуют, и они не редки 2. наилучшая практика - всегда иметь значения «четко определенные»; это означает, что всегда следует избегать любых двусмысленностей - 2 значения 1 значения всегда зло - это должно быть довольно ясно ..
 12 июн. 2012 г., 23:54
С точки зрения сохранения переданных байтов сжатие гораздо важнее, чем индексированные массивы.web-resource-optimization.blogspot.no/2011/06/… Убедитесь, что это первое, что вы делаете. В большинстве случаев добавление таких вещей, как индексированные массивы, это то, что я бы назвал преждевременной оптимизацией. Если вы не отправляете БОЛЬШОЕ количество данных. Это также требует дополнительного разбора, добавляя больше сложности вашему приложению. Gzipping легко делается браузером. (при условии, что клиент является браузером)
 12 июн. 2012 г., 21:31
Единственный случай, о котором я могу подумать, - это проверить, поддерживает ли браузер определенный тип событий. Например,if( typeof onbeforepaste == "undefined") увидеть, еслиonBeforePaste поддерживается. Даже тогда это не имеет никакого значения, поскольку вы можете назначать события всем, что хотите (они просто не будут ничего делать, если не поддерживаются).
 21 мар. 2014 г., 18:54
Поскольку HTTPS становится нормой дня (по крайней мере, для приложений с большой базой пользователей), сжатие идет полным ходом. Увидетьen.wikipedia.org/wiki/CRIME_%28security_exploit%29
 12 июн. 2012 г., 21:30
+1 заThere is usually no need to distinguish between null (no value) and undefined (no given value). Для этого есть даже удобный оператор!= null (не строгое предназначение)

Ваш ответ на вопрос