Reprezentowanie wartości null w JSON
Jaka jest preferowana metoda zwracania wartości pustych w JSON? Czy jest inna preferencja dla prymitywów?
Na przykład, jeśli mój obiekt na serwerze ma liczbę całkowitą o nazwie „myCount” bez wartości, najbardziej poprawnym JSON dla tej wartości będzie:
{}
lub
{
"myCount": null
}
lub
{
"myCount": 0
}
To samo pytanie dla ciągów znaków - jeśli mam na serwerze łańcuch pusty „myString”, to jest to najlepszy JSON:
{}
lub
{
"myString": null
}
lub
{
"myStrung": ""
}
lub (panie pomóż mi)
{
"myString": "null"
}
Podoba mi się, że konwencja dotycząca kolekcji jest reprezentowana w JSON jako pusta kolekcjahttp://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Reprezentowana byłaby pusta tablica:
{
"myArray": []
}
EDIT Podsumowanie
Argument „preferencji osobistych” wydaje się realistyczny, ale krótki w tym, ponieważ społeczność będzie konsumowała większą liczbę różnych usług / źródeł. Konwencje dotyczące struktury JSON pomogłyby znormalizować zużycie i ponowne wykorzystanie wspomnianych usług. Jeśli chodzi o ustanowienie standardu, sugerowałbym przyjęcie większości konwencji Jacksona z kilkoma wyjątkami:
Obiekty są preferowane w stosunku do prymitywów.Puste kolekcje są preferowane powyżej wartości null.Obiekty bez wartości są reprezentowane jako null.Prymitywy zwracają swoją wartość.Jeśli zwracasz obiekt JSON z przeważnie wartościami null, możesz mieć kandydata do refaktoryzacji na wiele usług.
{
"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
}
Powyższy JSON został wygenerowany z następującej klasy 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()));
}
}
Zależność Mavena:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>