Was ist die bevorzugte Methode zum Zurückgeben von Nullwerten in JSON? Gibt es eine andere Präferenz für Primitive?
Wenn mein Objekt auf dem Server beispielsweise eine Ganzzahl namens "myCount" ohne Wert hat, ist der korrekteste JSON für diesen Wert:
{}
oder
{
"myCount": null
}
oder
{
"myCount": 0
}
Gleiche Frage für Strings - Wenn ich einen Null-String "myString" auf dem Server habe, ist dies der beste JSON:
{}
oder
{
"myString": null
}
oder
{
"myString": ""
}
oder (Herr, hilf mir)
{
"myString": "null"
}
Ich mag die Konvention, dass Sammlungen im JSON als leere Sammlung dargestellt werden http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Ein leeres Array würde dargestellt:
{
"myArray": []
}
EDIT Zusammenfassung
Das Argument der „persönlichen Präferenz“ erscheint realistisch, ist jedoch insofern kurzsichtig, als wir als Gemeinschaft immer mehr unterschiedliche Dienste / Quellen konsumieren werden. Konventionen für die JSON-Struktur würden dazu beitragen, den Verbrauch und die Wiederverwendung dieser Dienste zu normalisieren. In Bezug auf die Festlegung eines Standards würde ich vorschlagen, die meisten Jackson-Konventionen mit wenigen Ausnahmen zu übernehmen:
- Objekte werden gegenüber Grundelementen bevorzugt.
- Leere Sammlungen werden Null vorgezogen.
- Objekte ohne Wert werden als null dargestellt.
- Primitive geben ihren Wert zurück.
Wenn Sie ein JSON-Objekt mit größtenteils Nullwerten zurückgeben, haben Sie möglicherweise einen Kandidaten für das Refactoring in mehrere Services.
{
"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
}
Der obige JSON wurde aus der folgenden Java-Klasse generiert.
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-Abhängigkeit:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
NSNull
Klasse mit einer Singleton-Instanz. Ein Verweis auf diese Instanz entspricht JSONs null
. Ich würde vermuten, dass eine andere Sprache das Gleiche tun könnte. Natürlich müsste man die Klasse des empfangenen Objekts überprüfen, bevor man sie in die vermutete Klasse umwandelt - sei sozusagen "nullbewusst".
Collections.emptyList()
). Auf diese Weise werden Null-Referenzfehler vermieden, die ansonsten schmerzhaft sein können.
Null
Klasse haben, da Sie ihre Werte nur Objekten ihres eigenen Typs oder Typs zuweisen könnten Object
.
null
, ob Ihr Client mit der leeren Zeichenfolge besser zurechtkommt odernull
- eine Zeichenfolge mit dem Wort "null" nicht von einem gültigen Wert zu unterscheiden ist. Tun Sie dies nicht.