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

4voto

iggie Punkte 414

Laut dem JSON-Spezifikation muss der äußerste Container nicht zwingend ein Wörterbuch (oder 'Objekt') sein, wie es in den meisten obenstehenden Kommentaren angedeutet wurde. Es kann auch eine Liste oder ein einfacher Wert sein (d.h. ein String, eine Nummer, ein Boolean oder null). Wenn du einen null-Wert in JSON darstellen möchtest, besteht die gesamte JSON-Zeichenkette (ohne die Anführungszeichen, die die JSON-Zeichenkette enthalten) einfach aus null. Keine Klammern, keine eckigen Klammern, keine Anführungszeichen. Du könntest ein Wörterbuch angeben, das einen Schlüssel mit einem null-Wert enthält ({"key1":null}), oder eine Liste mit einem null-Wert ([null]), aber diese sind keine null-Werte selbst - es handelt sich um richtige Wörterbücher und Listen. Ebenso sind ein leeres Wörterbuch ({}) oder eine leere Liste ([]) völlig in Ordnung, aber sind auch nicht null.

In Python:

>>> print json.loads('{"key1":null}')
{u'key1': None}
>>> print json.loads('[null]')
[None]
>>> print json.loads('[]')
[]
>>> print json.loads('{}')
{}
>>> print json.loads('null')
None

2voto

Wayne Punkte 58002

Dies ist eine persönliche und situationale Entscheidung. Wichtig ist zu bedenken, dass der leere String und die Zahl Null konzeptionell von null verschieden sind.

Im Fall eines count möchte man normalerweise immer eine gültige Zahl haben (es sei denn, der count ist unbekannt oder undefiniert), aber bei Strings, wer weiß? Der leere String könnte in Ihrer Anwendung etwas bedeuten. Oder auch nicht. Das liegt ganz bei Ihnen, dies zu entscheiden.

1voto

Jesse Steele Punkte 349

'null' ist am besten für den praktischen Gebrauch

FWIW, als Beispiel für die Verwendung von PHP interpretiert PHP leere Sets als von PHP erstellte Einträge...

// Diese Schleife wird ein Element mit dem Wert 'das Auto' durchlaufen
$empty_json = '["das Auto"]';
$some_json_array = json_decode($empty_json);

foreach ($some_json_array as $i) {
  echo "PHP sieht ein Element";
}

output: PHP sieht das Auto

// Diese Schleife wird ein Element durchlaufen, aber ohne Werte
$empty_json = '[""]';
$some_json_array = json_decode($empty_json);

foreach ($some_json_array as $i) {
  echo "PHP sieht: $i";
}

output: PHP sieht

// Diese Schleife wird nichts durchlaufen, weil die Funktion `json_decode()` von PHP wusste, dass es `null` war
$empty_json = 'null';
$some_json_array = json_decode($empty_json);

foreach ($some_json_array as $i) {
  echo "PHP sieht ein Element";
}

output: (nichts, foreach wird nicht durchlaufen)

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