JSON (JavaScript Object Notation) ist ein leichtgewichtiges Textformat für den Datenaustausch, das zum De-facto-Standard in der modernen Webentwicklung geworden ist. Trotz des Namens, der das Wort "JavaScript" enthält, ist JSON ein sprachunabhängiges Format und wird von fast allen modernen Programmiersprachen unterstützt.
Geschichte
JSON wurde Anfang der 2000er Jahre von Douglas Crockford als Alternative zu XML für die Datenübertragung zwischen Browser und Server entwickelt. Ursprünglich wurde das Format in State Software-Projekten verwendet, bei denen Crocford als Berater tätig war. Die offizielle JSON-Spezifikation wurde 2006 als RFC 4627 veröffentlicht und dann 2013 (RFC 7159) und 2017 (RFC 8259) aktualisiert.
Die Einfachheit und Lesbarkeit von JSON machte es schnell zu einer beliebten Wahl für Web-APIs. Heute wird JSON nicht nur in der Webentwicklung verwendet, sondern auch in Konfigurationsdateien, NoSQL-Datenbanken, beim Datenaustausch zwischen Microservices und in vielen anderen Bereichen.
Grundlagen der Syntax
JSON basiert auf zwei universellen Datenstrukturen: Objekten (Sammlungen von Schlüssel-Wert-Paaren) und Arrays (geordnete Wertelisten).
Datentypen
JSON unterstützt die folgenden Datentypen:
Zeilen - Sequenzen von Unicode-Zeichen in Anführungszeichen. Sonderzeichen werden mit einem umgekehrten Schrägstrich maskiert.
Zahlen - ganze oder gebrochene Zahlen im Dezimalsystem. JSON unterscheidet nicht zwischen Ganzzahlen und Gleitkommazahlen auf Syntaxebene.
Boolesche Werte — true oder false.
Null — ein spezieller Wert, der das Fehlen von Daten anzeigt.
Objekte — ungeordnete Sammlungen von Schlüssel-Wert-Paaren, wobei die Schlüssel immer Zeichenfolgen sind.
Arrays — geordnete Listen von Werten beliebiger Art.
Beispiel für eine Struktur
{
"user": {
"id": 12345,
"username": "developer",
"email": "dev@example.com",
"isActive": true,
"roles": ["admin", "editor"],
"profile": {
"firstName": "Ivan",
"lastName": "Petrov",
"age": 28
},
"lastLogin": null
}
}Arbeiten mit JSON in JavaScript
JavaScript bietet ein eingebautes Objekt JSON mit zwei Hauptmethoden für die Arbeit mit diesem Format.
Serialisierung: JSON.stringify()
Die Methode JSON.stringify() wandelt ein JavaScript-Objekt in eine JSON-Zeile um:
const user = {
name: "Alexey",
age: 30,
skills: ["JavaScript", "Vue.js", "Node.js"]
};
const jsonString = JSON.stringify(user);
// '{"name":"Alexey","age":30,"skills":["JavaScript","Vue.js","Node.js"]}'Die Methode unterstützt zusätzliche Parameter zur Steuerung der Formatierung:
// Schöne Formatierung mit Einrückungen
const formatted = JSON.stringify(user, null, 2);
// Selektive Serialisierung von Feldern
const filtered = JSON.stringify(user, ['name', 'age']);
// Verwenden der Ersatzfunktion
const custom = JSON.stringify(user, (key, value) => {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
});Deserialisierung: JSON.parse()
Die Methode JSON.parse() wandelt eine JSON-Zeile wieder in ein JavaScript-Objekt um:
const jsonString = '{"name":"Alexey","age":30}'
const user = JSON.parse(jsonString);
console.log(user.name); // "Alexey"Sie können die Rewriter-Funktion verwenden, um Werte beim Parsen zu transformieren:
const jsonWithDate = '{"created":"2024-01-15T10:30:00.000Z"}';
const data = JSON.parse(jsonWithDate, (key, value) => {
if (key === 'created') {
return new Date(value);
}
return value;
});
console.log(data.created instanceof Date); // true
Praktische Anwendungsmuster
Tiefes Kopieren von Objekten
JSON kann für schnelles Deep Copying von Objekten verwendet werden, obwohl diese Methode Einschränkungen hat:
const original = {
name: "Project",
data: { items: [1, 2, 3] }
};
const copy = JSON.parse(JSON.stringify(original));
copy.data.items.push(4);
console.log(original.data.items); // [1, 2, 3]
console.log(copy.data.items); // [1, 2, 3, 4]Es ist wichtig zu wissen, dass diese Methode keine Funktionen, Zeichen, undefinierte Werte kopiert und Objektprototypen verliert.
Speichern von Daten in localStorage
JSON ist ideal zum Serialisieren von Daten, bevor sie im Browser gespeichert werden:
// Speichern
const settings = {
theme: 'dark',
language: 'ru',
notifications: true
};
localStorage.setItem('settings', JSON.stringify(settings));
// Laden
const savedSettings = JSON.parse(localStorage.getItem('settings'));Arbeit mit API
Moderne APIs verwenden JSON als Hauptformat für den Datenaustausch:
// Daten werden an den Server gesendet
async function createUser(userData) {
const response = await fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
});
return await response.json();
}
// Anwendung
const newUser = await createUser({
name: "Maria",
email: "maria@example.com"
});Häufige Fehler und ihre Lösungen
Zyklische Links
JSON.stringify () löst einen Fehler aus, wenn zyklische Verweise vorhanden sind:
const obj = { name: "test" };
obj.self = obj;
// TypeError: Converting circular structure to JSON
// JSON.stringify(obj);
// Lösung mit WeakSet
function stringifyWithCircular(obj) {
const seen = new WeakSet();
return JSON.stringify(obj, (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return "[Circular]";
}
seen.add(value);
}
return value;
});
}Ungültiges JSON
Verwenden Sie bei der Arbeit mit externen Datenquellen immer die Fehlerbehandlung:
function safeJsonParse(jsonString, fallback = null) {
try {
return JSON.parse(jsonString);
} catch (error) {
console.error('JSON parsing error:', error.message);
return fallback;
}
}
const data = safeJsonParse(userInput, {});Verlust spezieller Datentypen
JSON unterstützt keine Datumsangaben, regulären Ausdrücke und andere spezielle Typen:
const data = {
created: new Date(),
pattern: /test/gi
};
const json = JSON.stringify(data);
// {"created":"2024-11-21T10:00:00.000Z","pattern":{}}
// Lösung: Erstellen benutzerdefinierter toJSON-Methoden
data.created.toJSON = function() {
return { _type: 'Date', value: this.toISOString() };
};JSON-Schema: Datenvalidierung
JSON Schema ist ein Wörterbuch zur Beschreibung und Validierung der Struktur von JSON-Daten:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["name", "email"]
}Die Verwendung von JSON Schema hilft, die Datenintegrität in großen Anwendungen sicherzustellen und eine API-Dokumentation zu erstellen.
Leistung und Optimierung
Bei der Arbeit mit großen Datenmengen ist es wichtig, die Leistung von JSON-Operationen zu berücksichtigen:
// Vermeiden Sie mehrfaches Parsing
// Schlecht
for (let i = 0; i < 1000; i++) {
const data = JSON.parse(jsonString);
processData(data);
}
// Gut
const data = JSON.parse(jsonString);
for (let i = 0; i < 1000; i++) {
processData(data);
}
// Verwenden Sie Streaming für große Dateien
async function processLargeJsonFile(url) {
const response = await fetch(url);
const reader = response.body.getReader();
const decoder = new TextDecoder();
// Teilweise Verarbeitung
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
// Chunk-Verarbeitung
}
}Sicherheit bei der Arbeit mit JSON
Schutz vor JSON-Injektionen
Bei der Arbeit mit Benutzereingaben ist es wichtig, eine direkte Verkettung von Zeilen zu vermeiden:
// Nicht sicher
const userInput = getUserInput();
const jsonString = '{"data":"' + userInput + '"}';
// Sicher
const jsonString = JSON.stringify({ data: userInput });Validierung der Eingabedaten
Validieren Sie immer Daten, die aus externen Quellen stammen:
function validateUserData(data) {
if (!data || typeof data !== 'object') {
throw new Error('Incorrect data format');
}
if (!data.name || typeof data.name !== 'string') {
throw new Error('Required name field is missing');
}
if (data.age && (typeof data.age !== 'number' || data.age < 0)) {
throw new Error('Invalid age value');
}
return true;
}Befund
JSON ist aufgrund seiner Einfachheit, Vielseitigkeit und breiten Unterstützung zu einem festen Bestandteil der modernen Entwicklung geworden. Das Verständnis der Feinheiten dieses Formats, die Kenntnis gängiger Muster und potenzieller Probleme hilft, zuverlässigere und produktivere Anwendungen zu erstellen. Unabhängig davon, ob Sie mit APIs, Konfigurationsdateien oder lokalen Datenspeichern arbeiten, bleibt JSON ein zuverlässiges Werkzeug für den strukturierten Informationsaustausch.
Möchten Sie Ihr Wissen in JavaScript und anderen Web-Entwicklungstechnologien vertiefen?
Treten Sie der Bildungsplattform bei Kodik, wo Sie interaktive Kurse in JavaScript, Python, HTML, CSS und anderen gefragten Technologien finden. Kodik hilft angehenden Entwickler*innen, das Programmieren durch praktische Aufgaben und strukturiertes Lernen zu erlernen.
Schließen Sie sich auch unserem Telegram-Kanal, wo Sie Unterstützung von erfahrenen Entwicklern erhalten, komplexe Probleme diskutieren und über die neuesten Entwicklungen in der Welt der Entwicklung auf dem Laufenden bleiben können!
