Каков предпочтительный метод для возврата нулевых значений в 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>