JavaScript JSON-Methoden, toJSON

Die JavaScript Object Notation (JSON) ist ein bemerkenswertes Format zur Darstellung von Objekten und Werten. Ursprünglich wurde dieses Format für JavaScript erstellt, aber mehrere Sprachen umfassen auch Bibliotheken für dessen Verarbeitung. Daher ist es einfacher, JSON zur Datenaustausch zu verwenden, falls der Client JavaScript verwendet und der Server in PHP, Ruby, Java und mehr geschrieben ist.

Im Allgemeinen bietet JavaScript zwei Methoden zur Konvertierung: JSON.stringify und JSON.parse. Sie können die erste Methode zum Konvertieren von Objekten in JSON und die zweite zum Konvertieren von JSON zurück in ein Objekt verwenden.

JSON.stringify

Betrachten Sie das folgende Beispiel zur Verwendung von JSON.stringify:

JSON stringify in javascript
let site = { name: 'W3Docs', hasAdmin: true, books: ['html', 'css', 'js', 'git'], booksCount: 4, }; let json = JSON.stringify(site); console.log(typeof json); // we've got a string! console.log(json); /* JSON-encoded object: { "name": "W3Docs", "hasAdmin": true, "books": ["html", "css", "js", "git"], "booksCount": 4 } */

Bitte beachten Sie, dass ein JSON-codiertes Objekt sich vom Objekt-Literal unterscheidet. Die Hauptunterschiede sind wie folgt:

  1. Der String verwendet doppelte Anführungszeichen. Es sollten keine einfachen Anführungszeichen oder Backticks in JSON sein. Zum Beispiel wird 'W3Docs' zu "W3Docs".
  2. Doppelte Anführungszeichen sollten auch für Eigenschaftsnamen von Objekten verwendet werden. Es ist obligatorisch. Zum Beispiel wird booksCount : 4 zu "booksCount": 4.

Sie können die Methode JSON.stringify auch auf Primitive anwenden. Es unterstützt die folgenden Datentypen:

Hier ist ein Beispiel:

JSON stringify in javascript
// a JSON number is an ordinary number console.log(JSON.stringify(10)) // 10 // a JSON string is a double-quoted string console.log(JSON.stringify([1, 2, 3])); // [1,2,3] console.log(JSON.stringify(false)); // false console.log(JSON.stringify('W3Docs')) // "W3Docs"

Beachten Sie, dass JSON.stringify einige JavaScript-spezifische Objekte überspringt, wie zum Beispiel Funktionseigenschaften (Methoden), symbolische Eigenschaften und Eigenschaften, die undefined speichern.

Betrachten wir den folgenden Fall:

JSON stringify in javascript
let site = { welcome() { // ignore console.log("Welcome"); }, [Symbol("id")]: 10, // ignore someProperty: undefined // ignore }; console.log(JSON.stringify(site)); // {} - empty object

Das Beste daran ist, dass verschachtelte Objekte automatisch unterstützt und konvertiert werden.

Zum Beispiel:

JSON stringify with nested objects javascript
let site = { name: "W3Docs", books: { booksCount: 4, booksTitle: ["html", "css", "js", "git"] } }; console.log(JSON.stringify(site)); /* The whole structure is stringified: { "name":"W3Docs", "book":{"booksCount":4,"booksTitle":["html","css", "js", "git"]}, } */

Aber es gibt auch eine wesentliche Einschränkung: Sie dürfen keine zirkulären Verweise verwenden.

Zum Beispiel:

Javascript json stringify objects not use circular references
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: ["html", "css", "js", "git"] }; site.tutorial = books; // site references books books.canUse = site; // books references site console.log(JSON.stringify(site)); // Error: Converting circular structure to JSON

Ausschließen und Transformieren: replacer

Für JSON.stringify wird die folgende vollständige Syntax verwendet:

let json = JSON.stringify(value[, replacer, space])

Es hat drei Argumente:

  • der Wert: ein Wert zur Codierung;
  • der replacer: das Array der Eigenschaften zur Codierung oder eine Mapping-Funktion function(key, value);;
  • der Raum: Anzahl der für die Formatierung verwendeten Leerzeichen.

JSON.stringify verwendet die meiste Zeit das erste Argument. Wenn Sie jedoch Ihren Ersetzungsprozess verbessern möchten, können Sie auch das zweite Argument verwenden. Wenn ihm ein Array von Eigenschaften übergeben wird, werden nur diese Eigenschaften codiert.

Betrachten wir das Beispiel:

JSON stringify in javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: [{ title: "html" }, { title: "css" }, { title: "js" }, { title: "git" }], tutorial: books // tutorial references books }; books.canUse = site; // books references site console.log(JSON.stringify(site, ['name', 'booksTitle'])); // {"name":"W3Docs","booksTitle":[{},{},{},{}]}
JSON stringify javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: [{ title: "html" }, { title: "css" }, { title: "js" }, { title: "git" }], tutorial: books // site references books }; books.canUse = site; //books references site console.log(JSON.stringify(site, ['name', 'booksTitle', 'tutorial', 'title', 'booksCount'])); /* { "name":"W3Docs", "booksTitle":[{"title":"html"},{"title":"css"}, {"title":"js"}, {"title":"git"}], "tutorial":{"booksCount":4} } */

Jetzt versuchen wir, alle Eigenschaften in die Liste aufzunehmen, ausgenommen books.free:

Wie Sie sehen können, wird alles serialisiert, außer canUse. Sie können auch feststellen, dass die gegebene Liste ziemlich lang aussieht. Glücklicherweise kann die Funktion replacer aufgerufen werden. Sie kann für jedes key, value Paar aufgerufen werden, und der “ersetzte” Wert kann zurückgegeben werden. Sie können es anstelle des ursprünglichen Wertes verwenden. Um das canUse zu ignorieren, wird undefined in dem unten stehenden Beispiel zurückgegeben:

JSON stringify in javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: [{ title: "html" }, { title: "css" }, { title: "js" }, { title: "git" }], tutorial: books // site references books }; books.canUse = site; // books references site console.log(JSON.stringify(site, function replacer(key, value) { console.log(`${key}: ${value}`); return (key == 'canUse') ? undefined : value; })); /* key:value pairs that come to replacer: : [object Object] name: W3Docs booksTitle: [object Object],[object Object],[object Object],[object Object] 0: [object Object] title: html 1: [object Object] title: css 2: [object Object] title: js 3: [object Object] title: git tutorial: [object Object] booksCount: 4 */

Beachten Sie, dass die replacer Funktion jedes Schlüssel/Wert-Paar zusammen mit Array-Elementen und verschachtelten Objekten erhält.

Formatierung: Raum

Wie bereits erwähnt, hat JSON.stringify drei Argumente. Das dritte ist die Anzahl der für die Formatierung verwendeten Leerzeichen. In der Regel verwenden Entwickler das space-Argument, um eine ausgezeichnete Ausgabe zu erreichen.

Der space = 2 beauftragt JavaScript, die verschachtelten Objekte auf verschiedenen Zeilen mit einer Einrückung von zwei Leerzeichen innerhalb eines Objekts anzuzeigen.

Zum Beispiel:

JSON stringify javascript
let user = { name: "Maria", age: 23, roles: { isAdmin: true, isContentWriter: false } }; console.log(JSON.stringify(user, null, 2)); /* two-space indents: { "name": "Maria", "age": 23, "roles": { "isAdmin": true, "isContentWriter": false } } */ /* for JSON.stringify(user, null, 2) the result would be more indented: { name: "Maria", age: 23, roles: { isAdmin: true, isContentWriter: false } }; */

Benutzerdefiniertes “toJSON”

In der Regel kann ein Objekt die Methode toJSON bereitstellen, um die to-JSON-Konvertierung zu implementieren. Wenn es verfügbar ist, ruft JSON.stringify es automatisch auf.

Hier ist ein Beispiel:

JSON stringify javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", update: new Date(Date.UTC(2020, 1, 2)), books }; console.log(JSON.stringify(site)); /* { "name":"W3Docs", "update":"2020-02-02T00:00:00.000Z", // (1) "books": {"booksCount":4 } // (2) } */

Im obigen Fall wird das update (1) in einen String umgewandelt. Der Grund dafür ist, dass alle Daten eine eingebaute toJSON-Methode haben.

Wenn Sie ein benutzerdefiniertes toJSON für das books-Objekt (2) hinzufügen, sieht es wie folgt aus:

toJSON in javascript
let books = { booksCount: 4, toJSON() { return this.booksCount; } }; let site = { name: "W3Docs", books }; console.log(JSON.stringify(books)); // 4 console.log(JSON.stringify(site)); /* { "name":"W3Docs", "books": 4 } */

JSON.parse

Zum Dekodieren eines JSON-Strings wird eine andere Methode verwendet, die JSON.parse heißt, mit der folgenden Syntax:

let value = JSON.parse(str, [reviver]);

JSON ist etwas kompliziert: Objekte und Arrays können andere Objekte und Arrays enthalten. Aber es ist obligatorisch, das Format von JSON einzuhalten.

Unten finden Sie die typischen Fehler in handgeschriebenen JSON:

let json = `{
  welcome: "Welcome",                     // mistake: property name without quotes
  "site": 'W3Docs',               // mistake: single quotes in value (must be double)
  'hasAdmin': true                  // mistake: single quotes in key (must be double)
  "update": new Date(2000, 2, 3), // mistake: no "new" is allowed, only bare values
  "books": [1, 2, 3, 4]              // here all fine
}`;

Beachten Sie auch, dass JSON keine Kommentare zulässt. Wenn Sie einen Kommentar hinzufügen, wird es ungültig. Es gibt ein spezielles Format JSON, das nicht zitierte Schlüssel, Kommentare und mehr unterstützt.

Zusammenfassung

JSON stellt ein Datenformat mit unabhängigem Standard und Bibliotheken für die meisten Programmiersprachen dar. Es unterstützt Arrays, Strings, Objekte, boolesche Werte, Zahlen und null.

JavaScript hat die Methoden JSON.stringify zum Serialisieren in JSON und JSON.parse zum Lesen aus JSON. Wenn ein Objekt toJSON hat, muss es durch JSON.stringify. aufgerufen werden.

Quizzeit: Testen Sie Ihre Fähigkeiten!

Sind Sie bereit, das Gelernte herauszufordern? Tauchen Sie ein in unsere interaktiven Quizze für ein tieferes Verständnis und eine unterhaltsame Art, Ihr Wissen zu festigen.

Finden Sie das nützlich?