Sollte JSON Nullwerte enthalten [geschlossen]

89

Ich erstelle eine API, die Ergebnisse als JSON zurückgibt. Gibt es derzeit eine bewährte Methode, ob Schlüssel in das Ergebnis aufgenommen werden sollen, wenn der Wert null ist? Beispielsweise:

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}

oder

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}

Da der zweite kleiner ist, neige ich zu diesem Stil, bin mir aber nicht sicher, ob es einen bevorzugten Stil gibt oder nicht. Aus Kundensicht scheinen beide Stile funktional gleichwertig zu sein. Irgendwelche Vor- oder Nachteile für jeden?

jjathman
quelle
6
Es ist unmöglich, dies richtig zu beantworten. Die richtige Antwort hängt von den Anforderungen der Anwendung ab. Das OP hat einfach die Antwort ausgewählt, die seinen Anforderungen entspricht. Wenn Ihre Anwendung unterscheiden muss, ob das "isbn" null ist oder ob das "isbn" aus einem anderen Grund möglicherweise nicht vom Server gesendet wurde, müssen Sie es einschließen.
Jacob
@Jacob Obwohl ich es nicht gesagt habe, war meine Absicht mit dieser Frage, dass der "vollständige" JSON, der die Antwort darstellt, zurückgegeben wird. Wenn ein Kunde davon ausgehen kann, dass es keinen funktionalen Unterschied zwischen den beiden Ansätzen zu geben scheint. Wenn die API selektiv keine Schlüssel / Werte zurückgeben würde, würde dies einen großen Unterschied machen, welcher Ansatz gewählt wurde.
Jjathman
Der Vorteil der ersten Darstellung besteht darin, dass das Objektschema erhalten bleibt und das Vorhandensein der Eigenschaft basierend auf Daten nicht mehrdeutig ist. im zweiten Format gehen diese Informationen verloren. JSON-Spezifikation als solche schreibt kein Format vor AFAIK
Surya Pratap

Antworten:

32

Der zweite spart eine kleine Menge an Bandbreite, aber wenn dies ein Problem wäre, würden Sie auch indizierte Arrays verwenden, anstatt den JSON mit Schlüsseln zu füllen. Ist eindeutig ["Foo Bar","Joe Blow"]viel kürzer als das, was Sie jetzt haben.

In Bezug auf die Benutzerfreundlichkeit denke ich nicht, dass es einen Unterschied macht. In beiden Fällen if(json.isbn)wird zum gesprungen else. Es besteht normalerweise keine Notwendigkeit, zwischen null(kein Wert) und undefined(kein gegebener Wert) zu unterscheiden.

Niet the Dark Absol
quelle
7
+1 für Normalerweise muss nicht zwischen null (kein Wert) und undefiniert (kein gegebener Wert) unterschieden werden. Es gibt sogar einen handlichen Operator dafür != null(nicht streng beabsichtigt)
Esailija
Der einzige Fall, den ich mir vorstellen kann, wäre zu testen, ob ein Browser einen bestimmten Ereignistyp unterstützt. Zum Beispiel, um if( typeof onbeforepaste == "undefined")zu sehen, ob onBeforePasteunterstützt wird. Selbst dann macht es keinen wirklichen Unterschied, da Sie Ereignisse nach Belieben zuweisen können (sie werden einfach nichts tun, wenn sie nicht unterstützt werden).
Niet the Dark Absol
6
Im Hinblick auf das Speichern übertragener Bytes ist die Komprimierung viel wichtiger als Dinge wie indizierte Arrays. web-resource-optimization.blogspot.no/2011/06/… Stellen Sie sicher, dass dies das erste ist, was Sie tun. In den meisten Fällen würde ich das Hinzufügen von Dingen wie indizierten Arrays darüber hinaus als vorzeitige Optimierung bezeichnen. Es sei denn, Sie senden große Datenmengen. Dies erfordert auch zusätzliches Parsen, wodurch Ihre App komplexer wird. Das Gzippen erfolgt nahtlos über den Browser. (vorausgesetzt, der Client ist ein Browser)
Martin Hansen
3
Da HTTPS zur Norm des Tages wird (zumindest für Apps mit großer Benutzerbasis), ist die Komprimierung ein Kinderspiel. Siehe en.wikipedia.org/wiki/CRIME_%28security_exploit%29
Gaurav Vaish
6
Ich würde dies tatsächlich für "Es gibt normalerweise keine Notwendigkeit, zwischen null zu unterscheiden" -1, wenn ich einen guten Ruf hätte. Aus 2 Gründen: 1. Gründe zur Unterscheidung existieren und sie sind nicht selten 2. Best Practice ist, immer Werte "gut definiert" zu haben, was bedeutet, immer Unklarheiten zu vermeiden - 2 Bedeutungen von 1 Wert sind immer böse - es sollte ziemlich klar sein.
Srneczek
80

Ich bin ein Fan davon, Null immer explizit einzuschließen, da dies Bedeutung hat. Das Weglassen einer Eigenschaft hinterlässt Mehrdeutigkeiten.

Solange Ihr Protokoll mit dem Server vereinbart ist, kann eines der oben genannten Verfahren funktionieren. Wenn Sie jedoch Nullen vom Server übergeben, werden Ihre APIs meiner Meinung nach später flexibler.

Sollte auch erwähnen, dass die hasOwnProperty-Funktion von Javascript Ihnen weitere Einblicke gibt.

/* if true object DOES contain the property with *some* value */
if( objectFromJSON.hasOwnProperty( "propertyName" ) )

/* if true object DOES contain the property and it has been set to null */
if( jsonObject.propertyName === null )

/* if true object either DOES NOT contain the property
   OR
   object DOES contain the property and it has been set to undefined */
if( jsonObject.propertyName === undefined )
Rushkeldon
quelle
3
Genau, mehr Menschen müssen den Unterschied zwischen "", null und undefiniert verstehen. Die Antwort auf diese Frage hängt von den Anforderungen des Benutzers ab.
Jacob
13
+1. Die Person am anderen Ende (die den Code geschrieben hat) wird durch explizite Werte besser bedient. Sie schreiben möglicherweise kein JavaScript ;-)
Steve11235
2
Beachten Sie, dass die Überprüfung gegen null nicht mit == funktioniert, === erforderlich ist (da undefiniert == null)!
Tommy
genau der erste Teil der akzeptierten Antwort ist so falsch ...
Srneczek
Ich würde schreiben "propertyName" in objectFromJSONstatt objectFromJSON.hasOwnProperty("propertyName"). Wenn Sie darauf bestehen, hasOwnPropertyschreiben Sie Object.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")aus Sicherheitsgründen.
Aadit M Shah
22

Bedeutet in JavaScript nulletwas ganz anderes als undefined.

Ihre JSON-Ausgabe sollte widerspiegeln, was von Ihrer Anwendung im spezifischen Kontext der Verwendung der JSON-Daten verwendet und benötigt wird.

Brad
quelle
5
Es gibt kein "undefiniertes" in JSON, daher denke ich, dass er nur fragt, ob "leere" Eigenschaften eingeschlossen werden sollen oder nicht - {"prop":undefined}unterscheidet sich von {}.
Bergi
Einverstanden versuche ich zu erklären, dass auf der Empfangsseite, wenn er nach einer bestimmten Eigenschaft sucht, die auf null gesetzt werden soll, dies nicht der Fall ist. Es wird undefiniert sein, wenn es weggelassen wird.
Brad
11

Sie sollten es auf jeden Fall einschließen, wenn zwischen nullund undefinedda diese in Javascript zwei verschiedene Bedeutungen haben, unterschieden werden muss. Sie können sich vorstellen, nulldass die Eigenschaft unbekannt oder bedeutungslos ist und undefineddass die Eigenschaft nicht existiert.

Wenn andererseits niemand diese Unterscheidung treffen muss, lassen Sie sie weg.

Paul
quelle
0

Ich denke, es ist kein Unterschied, wenn Sie den JSON als Daten für die Benutzererfahrung verwenden.

Der Unterschied tritt in JSON-Konfigurationsdateien auf, wenn ein Benutzer etwas von Hand bearbeiten sollte. Wenn Sie das erste Beispiel verwenden, geben Sie dem Benutzer einen Hinweis auf die Konfiguration.

Alexey Kachalov
quelle
1
Könnten Sie bitte Ihre Antwort näher erläutern und etwas mehr Beschreibung der von Ihnen bereitgestellten Lösung hinzufügen?
Abarisone