JSON/parse
Daten werden in JSON als Zeichenkette gespeichert. Um sie in JavaScript weiterzuverarbeiten, müssen sie mit JSON.parse()
umgewandelt werden, sodass aus dem JSON-String ein JavaScript-Objekt erstellt wird.
Syntax
JSON.parse(text[, reviver])
Parameter:
-
text
: String, der als JSON geparst werden soll. -
reviver
: (optional) Der reviver ist eine Funktion, mit der man das Parsing-Ergebnis umwandeln kann, bevor es zurückgegeben wird.
Rückgabewert ist das konvertierte Objekt.
Inhaltsverzeichnis
Reviver-Funktion
JSON.parse
rekonstruiert eigenständig einen JavaScript-Wert aus dem übergebenen JSON-String. Dabei werden Array- und Objektliterale, Zahlen, boolesche Werte und null automatisch konvertiert. Das Ergebnis ist, je nach JSON-String, ein Baum aus skalaren (Zahl, Boolean oder null) oder zusammengesetzten (Array, Objekt) Werten. Dieser Baum wird nun automatisch durchlaufen und für jeden darin enthaltenen Wert die Revive-Funktion aufgerufen. Für zusammengesetzte Werte gilt, dass der Reviver zuerst für die enthaltenen Werte und dann für das Array bzw. Objekt selber aufgerufen wird.
Bei jedem Aufruf erhält die Revive-Funktion zwei Parameter: Einen Namen und den zugehörigen Wert. Bei Objekten ist das der Name der zu konvertierenden Eigenschaft und bei Arrays der aktuelle Index (in einen String konvertiert). Die Revive-Funktion wird auch für den Wurzelwert des Wertebaumes aufgerufen, mit leerem Namen.
Bei verschachtelten Objekten kann der Name nicht hinreichend eindeutig sein, da die Reviver-Funktion nur den Eigenschaftsnamen erhält und nicht die Eigenschaftsnamen der übergeordneten Objekte. In diesem Fall sollte man auf eine Revive-Funktion verzichten und erforderliche Übersetzungen in einer nachgelagerten Verarbeitung durchführen.
Die Rückgabe der Revive-Funktion kann undefined
sein, dann wird diese Eigenschaft aus dem Wertebaum gelöscht. Alle anderen Rückgaben werden als neuer Wert für diese Eigenschaft gespeichert.
Anwendungsbeispiele
Deserialisierung eines einfachen Objekts
var obj = JSON.parse('{ "name": "Georg", "alter": 47, "verheiratet": false, "beruf": null}');
document.querySelector('output').innerText = obj.name + ", " + obj.alter;
Datum oder Zeit im JSON-String
Es gibt kein standardisiertes Format, in dem Datums- oder Zeitangaben in einem JSON-String gespeichert werden. Dementsprechend führt JSON.parse auch keine automatische Konvertierung in ein Date-Objekt durch. Es ist Sache des Anwenders, hier eine eigene Konvertierung vorzunehmen. Dafür gibt es zwei Möglichkeiten: eine handprogrammierte Nachverarbeitung des von JSON.parse zurückgegebenen Objekts, oder die Verwendung des revive-Callback.
var jsonString = '[ { "name": "Georg", "geburtsdatum": "1970-04-01", "verheiratet": false, "beruf": null} ]';
var obj = JSON.parse(jsonString);
if (obj.length > 0) {
obj.forEach(function(zeile) {
zeile.geburtsdatum = new Date(zeile.geburtsdatum);
});
document.querySelector('output').innerText = obj[0].name + ", " + obj[0].geburtsdatum;
}
Nicht ganz praxisnah ist der Verzicht auf eine genauere Prüfung der Rückgabe von JSON.parse; hier müsste eigentlich noch sichergestellt werden, dass ein Array zurückkommt.
Das eigentliche parsen des JSON-String erfolgt wie im vorherigen Beispiel, nur dass jetzt kein Alter vorhanden ist, sondern ein Geburtdatum. Das Datum liegt mangels Alternative als String-Eigenschaft vor und erscheint deswegen im Ergebnis von JSON.parse ebenfalls als String.
geburtsdatum
-Eigenschaft durch ein Date ersetzt. Im Fall des Datumsformats YYYY-MM-DD kann der Date-Konstruktor diese Konvertierung ausführen.Mit einer Revive-Funktion kann man auf die Nachverarbeitung verzichten:
var jsonString = '[ { "name": "Georg", "geburtsdatum": "1970-04-01", "verheiratet": false, "beruf": null} ]';
var obj = JSON.parse(jsonString, function(name, wert) {
if (name === "geburtsdatum")
wert = new Date(wert);
return wert;
});
if (obj.length > 0) {
document.querySelector('output').innerText = obj.name + ", " + obj.geburtsdatum;
}
geburtsdatum
-Eigenschaft aufgerufen wird, und ersetzt den Wert dann durch ein Date-Objekt. Die separater Nachverarbeitung entfällt, allerdings wird die Revive-Funktion für jede Eigenschaft des Objekts aufgerufen, was Laufzeitnachteile haben kann.Hinweise
fehlerhaftes JSON
Wenn die Daten in fehlerhafter Notation geschrieben werden, wirft JSON.parse()
einen Ausnahmefehler ('Syntax error'); d. h. es wird abgebrochen. Richtige Teile des Strings werden nicht geparst.
// String wird mit Komma abgeschlossen-> Ausnahmefehler
JSON.parse('[1, 2, 3, 4, ]');
Funktionen in JSON
Weblinks
- ECMA: JSON.parse
- MDN: JSON.parse
JSON.parse()
als Parameter übergeben und damit in ein JavaScript-Objekt umgewandelt. Das Objekt wird in der Variablenobj
gespeichert.Anschließend werden mit
obj.name
bzw.obj.alter
Name und Alter ermittelt und mit querySelector ausgegeben.Die Eigenschaftswerte 47, false und null sind im JSON-String nicht in Anführungszeichen gesetzt. JSON.parse akzeptiert diese Typen und speichert sie Zahl bzw. als booleschen Wert oder null.