Jaka jest preferowana metoda zwracania wartości zerowych w JSON? Czy istnieje 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 byłoby:
{}
lub
{
"myCount": null
}
lub
{
"myCount": 0
}
To samo pytanie dla ciągów - jeśli mam ciąg zerowy „myString” na serwerze, to najlepszy JSON:
{}
lub
{
"myString": null
}
lub
{
"myString": ""
}
lub (Panie, pomóż mi)
{
"myString": "null"
}
Podoba mi się konwencja reprezentowania kolekcji w JSON jako pusta kolekcja http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Pusta tablica byłaby reprezentowana:
{
"myArray": []
}
Podsumowanie edycji
Argument „osobistych preferencji” wydaje się realistyczny, ale w skrócie, jako społeczność będziemy konsumować coraz większą liczbę różnych usług / źródeł. Konwencje dotyczące struktury JSON pomogłyby znormalizować zużycie i ponowne wykorzystanie tych usług. Jeśli chodzi o ustanowienie standardu, proponuję przyjęcie większości konwencji Jacksona z kilkoma wyjątkami:
- Przedmioty są lepsze od prymitywów.
- Puste kolekcje są preferowane niż puste.
- Obiekty bez wartości są reprezentowane jako null.
- Prymitywy zwracają swoją wartość.
Jeśli zwracasz obiekt JSON z przeważnie wartościami zerowymi, możesz mieć kandydata do refaktoryzacji do wielu 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ść od Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
NSNull
klasa, która ma instancję singleton. Odwołanie do tego wystąpienia jest równoważne odwołaniu JSON null
. Domyślam się, że inny język mógłby zrobić to samo. Oczywiście należałoby sprawdzić klasę otrzymanego obiektu przed rzutem na przypuszczalną klasę - być „zerowym świadomym”, jak to było.
Collections.emptyList()
.). Pozwala to uniknąć błędów zerowych odniesień, które w innym przypadku mogą być uciążliwe.
Null
klasy, ponieważ można przypisać jej wartości tylko do obiektów własnego typu lub typu Object
.
null
, zastanów się, czy lepiej jest dla twojego klienta z pustym ciągiem lubnull
- ciąg zawierający słowo „null” jest nie do odróżnienia od prawidłowej wartości, nie rób tego.