Який кращий метод повернення нульових значень у JSON? Чи є інші переваги для примітивів?
Наприклад, якщо мій об’єкт на сервері має цілий номер, який називається "myCount" без значення, найбільш правильним JSON для цього значення буде:
{}
або
{
"myCount": null
}
або
{
"myCount": 0
}
Те саме питання для Strings - якщо у мене на сервері є нульова рядок "myString", це найкращий JSON:
{}
або
{
"myString": null
}
або
{
"myString": ""
}
або (лорд допоможи мені)
{
"myString": "null"
}
Мені подобається умова про те, щоб колекції були представлені в JSON як порожня колекція http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Порожній масив буде представлений:
{
"myArray": []
}
Підсумок EDIT
Аргумент "особистих уподобань" видається реалістичним, але короткозорий у тому, що ми, як громада, будемо споживати все більшу кількість різноманітних послуг / джерел. Конвенції про структуру 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()));
}
}
Залежна залежність:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
NSNull
клас, який має однотонний екземпляр. Посилання на цей екземпляр еквівалентна JSON null
. Я б здогадався, що інша мова могла зробити те саме. Звичайно, потрібно було б перевірити клас отриманого об'єкта перед тим, як подавати його до передбачуваного класу, - як би це було "невідомо".
Collections.emptyList()
). Це дозволяє уникнути нульових помилок, які в іншому випадку можуть заподіяти біль.
Null
клас, оскільки ви зможете призначити його значення лише об'єктам власного типу або типу Object
.
null
, подумайте, чи краще ваш клієнт із порожньою рядком абоnull
- рядок, що містить слово "null", не відрізняється від дійсного значення, не робіть цього.