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>
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.NSNull
Klasse mit einer Singleton-Instanz. Ein Verweis auf diese Instanz entspricht JSONsnull
. 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önntenObject
.Antworten:
Lassen Sie uns die Analyse jedes einzelnen bewerten:
http://jsfiddle.net/brandonscript/Y2dGv/
JSON1
{}
Dies gibt ein leeres Objekt zurück. Es gibt dort keine Daten und es wird Ihnen nur sagen, dass jeder Schlüssel, den Sie suchen (sei es
myCount
oder etwas anderes), vom Typ istundefined
.JSON2
{"myCount": null}
In diesem Fall
myCount
ist tatsächlich definiert, obwohl sein Wert istnull
. Dies ist nicht dasselbe wie "nichtundefined
und nichtnull
". Wenn Sie auf die eine oder andere Bedingung testen, ist dies möglicherweise erfolgreich, während JSON1 fehlschlagen würde.Dies ist die endgültige Darstellung
null
gemäß der JSON-Spezifikation .JSON3
{"myCount": 0}
In diesem Fall ist myCount 0. Das ist nicht dasselbe wie
null
und es ist nicht dasselbe wiefalse
. Wenn Ihre bedingte Anweisung ausgewertet wirdmyCount > 0
, ist dies möglicherweise sinnvoll. Wenn Sie hier Berechnungen basierend auf dem Wert ausführen, kann 0 hilfreich sein. Wenn Sie jedoch versuchen zu testennull
, wird dies überhaupt nicht funktionieren.JSON4
{"myString": ""}
In diesem Fall erhalten Sie eine leere Zeichenfolge. Wie bei JSON2 ist es wieder definiert, aber leer. Sie könnten testen für,
if (obj.myString == "")
aber Sie könnten nicht testen fürnull
oderundefined
.JSON5
{"myString": "null"}
Dies wird Sie wahrscheinlich in Schwierigkeiten bringen, da Sie den Zeichenfolgenwert auf null setzen. in diesem Fall ist
obj.myString == "null"
es jedoch nicht== null
.JSON6
{"myArray": []}
Dadurch erfahren Sie, dass Ihr Array
myArray
vorhanden, aber leer ist. Dies ist nützlich, wenn Sie versuchen, eine Zählung oder Bewertung durchzuführenmyArray
. Angenommen, SiemyArray.length
möchten die Anzahl der von einem Benutzer geposteten Fotos bewerten. Dies ist möglich, und es wird Folgendes zurückgegeben0
: definiert, aber keine geposteten Fotos.quelle
JSON1
dh{}
null
ist nicht Null. Es ist nicht ein Wert, per se : es ist ein Wert außerhalb des Bereichs der Variablen anzeigt , fehlt oder unbekannte Daten.Es gibt nur eine Möglichkeit,
null
in JSON darzustellen . Gemäß den Spezifikationen ( RFC 4627 und json.org ):quelle
json = '{"myValue":}';
Es gibt nur einen Weg, um darzustellen
null
; das ist mitnull
.Das heißt; Wenn einer der Clients, die Ihre JSON-Darstellung verwenden, den
===
Operator verwendet. es könnte ein Problem für sie sein.kein Wert
Wenn Sie vermitteln möchten, dass Sie ein Objekt haben, dessen Attribut
myCount
keinen Wert hat:kein Attribut / fehlendes Attribut
Was ist, wenn Sie vermitteln möchten, dass Sie ein Objekt ohne Attribute haben:
Der Client-Code versucht zuzugreifen
myCount
und abzurufenundefined
. es ist nicht da.leere Sammlung
Was ist, wenn Sie vermitteln möchten, dass Sie ein Objekt mit einem Attribut haben
myCount
, das eine leere Liste ist:quelle
Ich würde verwenden, um
null
zu zeigen, dass es für diesen bestimmten Schlüssel keinen Wert gibt. Verwenden Sie zum Beispielnull
darzustellen, dass "Anzahl der Geräte in Ihrem Haushalt, die eine Verbindung zum Internet herstellen" unbekannt ist.Verwenden Sie andererseits,
{}
wenn dieser bestimmte Schlüssel nicht anwendbar ist. Zum Beispiel sollten Sie keine Zählung anzeigen, auch wennnull
die Frage "Anzahl der Autos mit aktiver Internetverbindung" an jemanden gestellt wird, der keine Autos besitzt.Ich würde es vermeiden, einen Wert als Standard festzulegen, es sei denn, dieser Standard ist sinnvoll. Während Sie sich möglicherweise dafür entscheiden,
null
keinen Wert darzustellen, verwenden Sie dies sicherlich niemals"null"
.quelle
Ich würde "Standard" für den Datentyp der Variablen auswählen (
null
für Zeichenfolgen / Objekte,0
für Zahlen), aber tatsächlich prüfen, welchen Code das Objekt erwartet. Vergessen Sie nicht, dass es manchmal einen Unterschied zwischennull
/ default und "nicht vorhanden" gibt.Überprüfen Sie das Nullobjektmuster - manchmal ist es besser, ein spezielles Objekt anstelle von
null
(dh[]
Array anstelle vonnull
Arrays oder""
Zeichenfolgen) zu übergeben.quelle
Dies ist eine persönliche und situative Entscheidung. Wichtig ist, dass sich die leere Zeichenfolge und die Zahl Null konzeptionell von unterscheiden
null
.Im Fall von a
count
möchten Sie wahrscheinlich immer eine gültige Nummer (es sei denn, diecount
ist unbekannt oder undefiniert), aber im Fall von Zeichenfolgen, wer weiß? Die leere Zeichenfolge könnte etwas in Ihrer Anwendung bedeuten . Oder vielleicht auch nicht. Die Entscheidung liegt bei Ihnen.quelle
Gemäß der JSON-Spezifikation muss der äußerste Container kein Wörterbuch (oder 'Objekt') sein, wie in den meisten obigen Kommentaren impliziert. Es kann auch eine Liste oder ein bloßer Wert sein (dh Zeichenfolge, Zahl, Boolescher Wert oder Null). Wenn Sie einen Nullwert in JSON darstellen möchten, ist die gesamte JSON-Zeichenfolge (mit Ausnahme der Anführungszeichen, die die JSON-Zeichenfolge enthalten) einfach
null
. Keine Klammern, keine Klammern, keine Anführungszeichen. Sie können ein Wörterbuch angeben, das einen Schlüssel mit einem Nullwert ({"key1":null}
) oder eine Liste mit einem Nullwert ([null]
) enthält. Dies sind jedoch selbst keine Nullwerte, sondern geeignete Wörterbücher und Listen. Ebenso sind ein leeres Wörterbuch ({}
) oder eine leere Liste ([]
) vollkommen in Ordnung, aber auch nicht null.In Python:
quelle
null
einen gültigen JSON darstellt. Der Haupttext und die Abbildungen dort sind mehrdeutig und wenn irgendetwas darauf hindeutet, sind nur Objekte und Arrays an der Wurzel gültig.