Каков предпочтительный метод для возврата нулевых значений в JSON? Есть ли другое предпочтение примитивам?
Например, если мой объект на сервере имеет Integer с именем «myCount» без значения, наиболее правильным JSON для этого значения будет:
{}
или
{
"myCount": null
}
или
{
"myCount": 0
}
Тот же вопрос для строк - если у меня есть пустая строка «myString» на сервере, лучше всего JSON:
{}
или
{
"myString": null
}
или
{
"myString": ""
}
или (господин, помоги мне)
{
"myString": "null"
}
Мне нравится соглашение о представлении коллекций в JSON в виде пустой коллекции http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Пустой массив будет представлен:
{
"myArray": []
}
РЕДАКТИРОВАТЬ Резюме
Аргумент «личных предпочтений» кажется реалистичным, но недальновидным в этом, поскольку в качестве сообщества мы будем потреблять все большее количество разрозненных услуг / источников. Соглашения о структуре JSON помогут нормализовать потребление и повторное использование указанных услуг. Что касается установления стандарта, я бы предложил принять большинство соглашений Джексона с несколькими исключениями:
- Объекты предпочтительнее примитивов.
- Пустые коллекции предпочтительнее нуля.
- Объекты без значения представлены как ноль.
- Примитивы возвращают свою ценность.
Если вы возвращаете объект JSON с большей частью нулевыми значениями, у вас может быть кандидат на рефакторинг в несколько сервисов.
{
"value1": null,
"value2": null,
"text1": null,
"text2": "hello",
"intValue": 0, //use primitive only if you are absolutely sure the answer is 0
"myList": [],
"myEmptyList": null, //NOT BEST PRACTICE - return [] instead
"boolean1": null, //use primitive only if you are absolutely sure the answer is true/false
"littleboolean": false
}
Приведенный выше JSON был сгенерирован из следующего класса Java.
package jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonApp {
public static class Data {
public Integer value1;
public Integer value2;
public String text1;
public String text2 = "hello";
public int intValue;
public List<Object> myList = new ArrayList<Object>();
public List<Object> myEmptyList;
public Boolean boolean1;
public boolean littleboolean;
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Data()));
}
}
Maven зависимость:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
null
, подумайте, лучше ли ваш клиент с пустой строкой илиnull
- строка, содержащая слово «ноль», неотличима от допустимого значения, не делайте этого.NSNull
класс, который имеет единственный экземпляр. Ссылка на этот экземпляр эквивалентна JSONnull
. Я предполагаю, что другой язык может сделать то же самое. Конечно, нужно было бы проверить класс полученного объекта перед приведением к предполагаемому классу - быть как бы «осведомленным о нуле».Collections.emptyList()
). Это позволяет избежать ошибок с нулевыми ссылками, которые в противном случае могут причинить боль.Null
класса, потому что вы сможете назначать его значения только объектам его собственного типа или типаObject
.Ответы:
Давайте оценим разбор каждого:
http://jsfiddle.net/brandonscript/Y2dGv/
JSON1
{}
Это возвращает пустой объект. Там нет никаких данных, и он только скажет вам, что любой ключ, который вы ищете (будь то
myCount
или что-то еще), имеет типundefined
.JSON2
{"myCount": null}
В этом случае
myCount
фактически определяется, хотя его значениеnull
. Это не то же самое, что и «нет,undefined
и нетnull
», и если вы тестировали одно или другое условие, это могло бы быть успешным, в то время как JSON1 не выполнялся.Это точный способ представления в
null
соответствии со спецификацией JSON .JSON3
{"myCount": 0}
В этом случае myCount равен 0. Это не то же самое
null
, и это не то же самое, чтоfalse
. Если ваше условное утверждение оцениваетmyCount > 0
, то это может быть полезно. Более того, если вы выполняете расчеты на основе значения здесь, 0 может быть полезным. Если вы пытаетесь проверить,null
однако, это на самом деле не будет работать вообще.JSON4
{"myString": ""}
В этом случае вы получаете пустую строку. Опять же, как и в JSON2, он определен, но он пуст. Вы можете проверить,
if (obj.myString == "")
но вы не можете проверитьnull
илиundefined
.JSON5
{"myString": "null"}
Это, вероятно, доставит вам неприятности, потому что вы устанавливаете строковое значение в null; в этом случае,
obj.myString == "null"
однако это не так== null
.JSON6
{"myArray": []}
Это скажет вам, что ваш массив
myArray
существует, но он пуст. Это полезно, если вы пытаетесь выполнить подсчет или оценкуmyArray
. Например, предположим, что вы хотите оценить количество фотографий, опубликованных пользователем, - вы можете сделать это,myArray.length
и он вернется0
: определено, но фотографий не опубликовано.источник
JSON1
т. е.{}
null
не ноль. По сути, это не значение : это значение вне области переменной, указывающее на отсутствующие или неизвестные данные.Существует только один способ представления
null
в JSON. Согласно спецификации ( RFC 4627 и json.org ):источник
json = '{"myValue":}';
Есть только один способ представлять
null
; это сnull
.Так сказать; если какой-либо из клиентов, использующих ваше представление JSON, использует
===
оператор; это может быть проблемой для них.неважно
Если вы хотите передать, что у вас есть объект, атрибут которого
myCount
не имеет значения:нет атрибута / отсутствует атрибут
Что если вам передать, что у вас есть объект без атрибутов:
Код клиента будет пытаться получить доступ
myCount
и получитьundefined
; это не там.пустая коллекция
Что если вы передадите, что у вас есть объект с атрибутом,
myCount
который является пустым списком:источник
Я хотел бы использовать,
null
чтобы показать, что нет никакого значения для этого конкретного ключа. Например, используйтеnull
для представления того, что «количество устройств в вашей семье, подключенных к Интернету» неизвестно.С другой стороны, используйте,
{}
если этот конкретный ключ не применим. Например, вы не должны показывать счет, даже еслиnull
на вопрос «количество автомобилей с активным интернет-соединением» задается тот, у кого нет автомобилей.Я бы не стал использовать любое значение по умолчанию, если это значение не имеет смысла. Хотя вы можете решить использовать
null
для представления никакой ценности, конечно, никогда не используйте"null"
для этого.источник
Я бы выбрал «default» для типа данных переменной (
null
для строк / объектов,0
для чисел), но на самом деле проверил, какой код ожидает этот объект. Не забывайте, что иногда есть различие междуnull
/ default и «не присутствует».Проверьте шаблон нулевого объекта - иногда лучше передать какой-то специальный объект вместо
null
(то есть[]
массив вместоnull
массивов или""
для строк).источник
Это личный и ситуативный выбор. Важно помнить, что пустая строка и число ноль концептуально отличаются от
null
.В случае a
count
вы, вероятно, всегда хотите какое-то действительное число (еслиcount
оно неизвестно или не определено), но в случае строк, кто знает? Пустая строка может что- то значить в вашем приложении. Или, может быть, это не так. Это решать вам.источник
Согласно спецификации JSON , внешний контейнер не обязательно должен быть словарем (или «объектом»), как подразумевается в большинстве комментариев выше. Это также может быть список или пустое значение (т. Е. Строка, число, логическое значение или ноль). Если вы хотите представить нулевое значение в JSON, вся строка JSON (исключая кавычки, содержащие строку JSON) - это просто
null
. Без скобок, без скобок, без кавычек. Вы можете указать словарь, содержащий ключ с нулевым значением ({"key1":null}
) или список с нулевым значением ([null]
), но сами они не являются нулевыми значениями - это правильные словари и списки. Точно так же пустой словарь ({}
) или пустой список ([]
) вполне подойдут, но и не равны нулю.В Python:
источник
null
образуют действительный JSON. Основной основной текст и иллюстрации там неоднозначны, и, если что-то и предполагает, что в корне допустимы только объекты и массивы.