Was ist die bevorzugte Methode zur Rückgabe von Null-Werten in JSON? Gibt es eine unterschiedliche Präferenz für Primitiven?
Zum Beispiel, wenn mein Objekt auf dem Server ein Integer namens "meineAnzahl" ohne Wert hat, wäre das korrekteste JSON für diesen Wert:
{}
oder
{
"meineAnzahl": null
}
oder
{
"meineAnzahl": 0
}
Gleiche Frage für Strings - wenn ich einen Null-String "meinString" auf dem Server habe, ist das beste JSON:
{}
oder
{
"meinString": null
}
oder
{
"meinString": ""
}
oder (Herr hilf mir)
{
"meinString": "null"
}
Ich mag die Konvention, dass Kollektionen im JSON als leere Kollektion dargestellt werden http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Ein leeres Array würde dargestellt werden:
{
"meinArray": []
}
Zusammenfassung der Bearbeitung
Das Argument der 'persönlichen Präferenz' scheint realistisch zu sein, aber kurzsichtig, da wir als Gemeinschaft eine immer größere Anzahl verschiedener Dienste/Quellen konsumieren werden. Konventionen für die JSON-Struktur würden helfen, den Konsum und die Wiederverwendung solcher Dienste zu standardisieren. In Bezug auf die Festlegung eines Standards würde ich vorschlagen, die meisten Jackson-Konventionen mit einigen Ausnahmen zu übernehmen:
- Objekte werden Primitiven vorgezogen.
- Leere Kollektionen werden Null vorgezogen.
- Objekte ohne Wert werden als null dargestellt.
- Primitiven geben ihren Wert zurück.
Wenn Sie ein JSON-Objekt mit überwiegend Null-Werten zurückgeben, haben Sie möglicherweise einen Kandidaten für eine Refaktorisierung in mehrere Dienste.
{
"wert1": null,
"wert2": null,
"text1": null,
"text2": "hello",
"intValue": 0, // verwenden Sie Primitiven nur, wenn Sie absolut sicher sind, dass die Antwort 0 ist
"meineListe": [],
"meineLeereListe": null, // NICHT BESTE PRAXIS - geben Sie [] zurück
"boolean1": null, // verwenden Sie Primitiven nur, wenn Sie absolut sicher sind, ob die Antwort true/false ist
"littleboolean": false
}
Das 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 Daten {
public Integer wert1;
public Integer wert2;
public String text1;
public String text2 = "hello";
public int intValue;
public List meineListe = new ArrayList();
public List meineLeereListe;
public Boolean boolean1;
public boolean littleboolean;
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Daten()));
}
}
Maven-Abhängigkeit:
com.fasterxml.jackson.core
jackson-core
2.3.0