650 Stimmen

Die Darstellung von null in JSON

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

564voto

brandonscript Punkte 62361

Lassen Sie uns das Parsen von jedem bewerten:

http://jsfiddle.net/brandonscript/Y2dGv/

var json1 = '{}';
var json2 = '{"myCount": null}';
var json3 = '{"myCount": 0}';
var json4 = '{"myString": ""}';
var json5 = '{"myString": "null"}';
var json6 = '{"myArray": []}';

console.log(JSON.parse(json1)); // {}
console.log(JSON.parse(json2)); // {myCount: null}
console.log(JSON.parse(json3)); // {myCount: 0}
console.log(JSON.parse(json4)); // {myString: ""}
console.log(JSON.parse(json5)); // {myString: "null"}
console.log(JSON.parse(json6)); // {myArray: []}

Das tl;dr hier:

Die Fragment in der json2 Variable ist die Art und Weise, wie das JSON-Spezifikation null repräsentieren soll. Aber wie immer hängt es davon ab, was Sie tun - manchmal funktioniert der "richtige" Weg nicht immer für Ihre Situation. Verwenden Sie Ihr Urteilsvermögen und treffen Sie eine informierte Entscheidung.


JSON1 {}

Dies liefert ein leeres Objekt. Es sind keine Daten vorhanden, und es wird Ihnen nur mitteilen, dass der Schlüssel, nach dem Sie suchen (sei es myCount oder etwas anderes), vom Typ undefined ist.


JSON2 {"myCount": null}

In diesem Fall ist myCount tatsächlich definiert, auch wenn sein Wert null ist. Das ist nicht dasselbe wie sowohl "nicht undefined und nicht null", und wenn Sie eine Bedingung für eines der beiden testen würden, könnte dies erfolgreich sein, während JSON1 scheitern würde.

Dies ist die maßgebliche Art und Weise, null gemäß der JSON-Spezifikation darzustellen.


JSON3 {"myCount": 0}

In diesem Fall ist myCount 0. Das ist nicht dasselbe wie null, und es ist auch nicht dasselbe wie false. Wenn Ihre bedingte Anweisung myCount > 0 auswertet, könnte dies sinnvoll sein. Darüber hinaus könnte 0 nützlich sein, wenn Sie Berechnungen basierend auf dem Wert hier durchführen. Wenn Sie jedoch auf null testen möchten, funktioniert dies tatsächlich überhaupt nicht.


JSON4 {"myString": ""}

In diesem Fall erhalten Sie einen leeren String. Wie bei JSON2 ist er definiert, aber leer. Sie könnten überprüfen if (obj.myString == ""), aber Sie könnten nicht auf null oder undefined testen.


JSON5 {"myString": "null"}

Dies könnte Ihnen Schwierigkeiten bereiten, denn Sie setzen den String-Wert auf null; in diesem Fall ist obj.myString == "null", jedoch ist es nicht == null.


JSON6 {"myArray": []}

Dies wird Ihnen sagen, dass Ihr Array myArray existiert, aber es ist leer. Das ist nützlich, wenn Sie eine Zählung oder Bewertung von myArray durchführen möchten. Beispielsweise, wenn Sie die Anzahl der Fotos auswerten möchten, die ein Benutzer gepostet hat - Sie könnten myArray.length ausführen und es würde 0 zurückgeben: definiert, aber keine Fotos gepostet.

271voto

Nicholas Carey Punkte 64738

null ist nicht null. Es ist kein Wert an sich: es ist ein Wert außerhalb des Bereichs der Variable, der fehlende oder unbekannte Daten angibt.

Es gibt nur eine Möglichkeit, null in JSON darzustellen. Gemäß den Spezifikationen (RFC 4627 und json.org):

2.1.  Werte

Ein JSON-Wert MUSS ein Objekt, ein Array, eine Zahl oder ein String sein oder einer
der folgenden drei Literalnamen:

  false null true

hier Bildbeschreibung eingeben

49voto

dnozay Punkte 22949

Es gibt nur eine Möglichkeit, null darzustellen; und das ist mit null.

console.log(null === null);   // true
console.log(null === true);   // false
console.log(null === false);  // false
console.log(null === 'null'); // false
console.log(null === "null"); // false
console.log(null === "");     // false
console.log(null === []);     // false
console.log(null === 0);      // false

Das heißt; wenn einer der Clients, die Ihre JSON-Darstellung konsumieren, den === Operator verwenden; könnte das ein Problem für sie sein.

kein Wert

Wenn Sie mitteilen möchten, dass Sie ein Objekt haben, dessen Attribut myCount keinen Wert hat:

{ "myCount": null }

kein Attribut / fehlendes Attribut

Was ist, wenn Sie mitteilen möchten, dass Sie ein Objekt ohne Attribute haben:

{}

Der Client-Code wird versuchen auf myCount zuzugreifen und undefined erhalten; es ist nicht vorhanden.

leere Sammlung

Was ist, wenn Sie mitteilen möchten, dass Sie ein Objekt mit einem Attribut myCount haben, das eine leere Liste ist:

{ "myCount": [] }

18voto

marcoseu Punkte 3882

Ich würde null verwenden, um zu zeigen, dass für diesen bestimmten Schlüssel kein Wert vorhanden ist. Zum Beispiel, verwenden Sie null, um darzustellen, dass die "Anzahl der Geräte in Ihrem Haushalt, die mit dem Internet verbunden sind", unbekannt ist.

Andererseits verwenden Sie {}, wenn dieser bestimmte Schlüssel nicht zutrifft. Zum Beispiel sollten Sie keine Anzahl angeben, auch nicht null, wenn jemand gefragt wird, wie viele Autos über eine aktive Internetverbindung verfügen, und diese Person keine Autos besitzt.

Ich würde es vermeiden, einen Standardwert festzulegen, es sei denn, dieser Standardwert ergibt Sinn. Während Sie sich entscheiden können, null zu verwenden, um keinen Wert darzustellen, verwenden Sie niemals "null" dafür.

9voto

Alexei Levenkov Punkte 96742

Ich würde "standardmäßig" als Datentyp für die Variable wählen (null für Zeichenfolgen/Objekte, 0 für Zahlen), aber überprüfe tatsächlich, was der Code, der das Objekt verbraucht, erwartet. Vergiss nicht, dass es manchmal einen Unterschied gibt zwischen null/standardmäßig und "nicht vorhanden".

Schau dir das Null-Objekt-Muster an - manchmal ist es besser, ein spezielles Objekt anstelle von null zu übergeben (z.B. [] Array anstelle von null für Arrays oder "" für Zeichenfolgen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X