# 📄 JSON in JavaScript - Umfassende Dokumentation
:::info
**JavaScript Object Notation (JSON)** ist ein leichtgewichtiges, textbasiertes Datenformat, das für den Datenaustausch zwischen Anwendungen verwendet wird. Es basiert auf der JavaScript-Objektsyntax, ist aber sprachunabhängig.
:::
## 🎯 Inhaltsverzeichnis
- [Was ist JSON?](#was-ist-json)
- [JSON-Syntax](#json-syntax)
- [JavaScript JSON-Methoden](#javascript-json-methoden)
- [Praktische Beispiele](#praktische-beispiele)
- [Fehlerbehandlung](#fehlerbehandlung)
- [Best Practices](#best-practices)
- [Häufige Fallstricke](#häufige-fallstricke)
---
## 🔍 Was ist JSON?
JSON (JavaScript Object Notation) ist ein standardisiertes Datenformat, das:
- **Human-readable** ist (für Menschen lesbar)
- **Lightweight** ist (kompakt und effizient)
- **Language-independent** ist (sprachunabhängig)
- **Based on JavaScript syntax** ist (basiert auf JavaScript-Syntax)
### Verwendungszwecke
```mermaid
graph TD
A[JSON] --> B[Web APIs]
A --> C[Konfigurationsdateien]
A --> D[Datenspeicherung]
A --> E[Client-Server Kommunikation]
A --> F[NoSQL Datenbanken]
```
---
## 📝 JSON-Syntax
### Grundlegende Regeln
:::warning
**Wichtige Syntaxregeln:**
- Daten werden in Name/Wert-Paaren gespeichert
- Daten werden durch Kommas getrennt
- Geschweifte Klammern `{}` halten Objekte
- Eckige Klammern `[]` halten Arrays
- Strings müssen in Anführungszeichen stehen
:::
### Unterstützte Datentypen
| Datentyp | Beispiel | Beschreibung |
|----------|----------|--------------|
| `string` | `"Hallo Welt"` | Text in Anführungszeichen |
| `number` | `42`, `3.14` | Ganze Zahlen und Dezimalzahlen |
| `boolean` | `true`, `false` | Wahrheitswerte |
| `null` | `null` | Leerer Wert |
| `object` | `{"key": "value"}` | Sammlung von Key-Value-Paaren |
| `array` | `[1, 2, 3]` | Geordnete Liste von Werten |
### Beispiel einer JSON-Struktur
```json
{
"name": "Max Mustermann",
"alter": 30,
"istAktiv": true,
"adresse": {
"straße": "Musterstraße 123",
"stadt": "Musterstadt",
"plz": "12345"
},
"hobbys": ["Lesen", "Schwimmen", "Programmieren"],
"partner": null
}
```
---
## ⚙️ JavaScript JSON-Methoden
### `JSON.stringify()`
Konvertiert JavaScript-Objekte in JSON-Strings.
#### Syntax
```javascript
JSON.stringify(value[, replacer[, space]])
```
#### Parameter
| Parameter | Typ | Beschreibung |
|-----------|-----|--------------|
| `value` | any | Der zu konvertierende Wert |
| `replacer` | function/array | Optional: Filterfunktion oder Array |
| `space` | string/number | Optional: Einrückung für Formatierung |
#### Beispiele
```javascript
// Einfache Konvertierung
const obj = { name: "Anna", age: 25 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // '{"name":"Anna","age":25}'
// Mit Formatierung
const formatted = JSON.stringify(obj, null, 2);
console.log(formatted);
/*
{
"name": "Anna",
"age": 25
}
*/
// Mit Replacer-Funktion
const filtered = JSON.stringify(obj, (key, value) => {
return key === 'age' ? undefined : value;
});
console.log(filtered); // '{"name":"Anna"}'
```
### `JSON.parse()`
Konvertiert JSON-Strings in JavaScript-Objekte.
#### Syntax
```javascript
JSON.parse(text[, reviver])
```
#### Parameter
| Parameter | Typ | Beschreibung |
|-----------|-----|--------------|
| `text` | string | Der zu parsende JSON-String |
| `reviver` | function | Optional: Transformationsfunktion |
#### Beispiele
```javascript
// Einfaches Parsing
const jsonString = '{"name":"Anna","age":25}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // "Anna"
// Mit Reviver-Funktion
const dateString = '{"date":"2024-01-01T10:00:00.000Z"}';
const objWithDate = JSON.parse(dateString, (key, value) => {
return key === 'date' ? new Date(value) : value;
});
console.log(objWithDate.date instanceof Date); // true
```
---
## 💡 Praktische Beispiele
### Beispiel 1: Benutzerdaten verwalten
```javascript
// Benutzerdaten-Objekt
const benutzer = {
id: 1,
name: "Sarah Schmidt",
email: "sarah@example.com",
registrierung: new Date(),
einstellungen: {
theme: "dark",
sprache: "de",
benachrichtigungen: true
},
tags: ["premium", "aktiv"]
};
// Zu JSON konvertieren (für API-Aufruf)
const benutzerJSON = JSON.stringify(benutzer);
// JSON empfangen und parsen (von API)
const empfangenesDaten = JSON.parse(benutzerJSON);
```
### Beispiel 2: Lokale Datenspeicherung
```javascript
// Daten im localStorage speichern
const appEinstellungen = {
theme: "light",
autoSave: true,
lastLogin: new Date().toISOString()
};
localStorage.setItem('einstellungen', JSON.stringify(appEinstellungen));
// Daten aus localStorage laden
const geladeneEinstellungen = JSON.parse(
localStorage.getItem('einstellungen') || '{}'
);
```
### Beispiel 3: API-Kommunikation mit fetch
```javascript
// Daten an API senden
async function benutzerErstellen(benutzerDaten) {
try {
const response = await fetch('/api/benutzer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(benutzerDaten)
});
const result = await response.json();
return result;
} catch (error) {
console.error('Fehler beim Erstellen des Benutzers:', error);
}
}
// Daten von API abrufen
async function benutzerLaden(id) {
try {
const response = await fetch(`/api/benutzer/${id}`);
const benutzer = await response.json();
return benutzer;
} catch (error) {
console.error('Fehler beim Laden des Benutzers:', error);
}
}
```
---
## 🛡️ Fehlerbehandlung
### Try-Catch für JSON.parse()
```javascript
function sicheresJSONParsing(jsonString) {
try {
const obj = JSON.parse(jsonString);
return { success: true, data: obj };
} catch (error) {
console.error('JSON Parsing Fehler:', error.message);
return { success: false, error: error.message };
}
}
// Verwendung
const result = sicheresJSONParsing('{"invalid": json}');
if (result.success) {
console.log('Daten:', result.data);
} else {
console.log('Fehler:', result.error);
}
```
### Validierung vor dem Parsing
```javascript
function istGültigesJSON(str) {
try {
JSON.parse(str);
return true;
} catch {
return false;
}
}
// Verwendung
const jsonString = '{"name": "Test"}';
if (istGültigesJSON(jsonString)) {
const obj = JSON.parse(jsonString);
// Verarbeitung...
}
```
---
## ✅ Best Practices
### 1. Defensive Programmierung
```javascript
// Immer prüfen, ob Daten existieren
const daten = JSON.parse(localStorage.getItem('benutzer') || '{}');
const name = daten.name || 'Unbekannt';
```
### 2. Datenvalidierung
```javascript
function validiereBenutzer(benutzer) {
const erforderlicheFelder = ['name', 'email'];
for (const feld of erforderlicheFelder) {
if (!benutzer[feld]) {
throw new Error(`Erforderliches Feld fehlt: ${feld}`);
}
}
return true;
}
```
### 3. Typsichere Konvertierung
```javascript
function sicherZuJSON(obj) {
// Undefined-Werte herausfiltern
return JSON.stringify(obj, (key, value) => {
return value === undefined ? null : value;
});
}
```
### 4. Performance-Optimierung
```javascript
// Für große Objekte: Streaming verwenden
function verarbeiteGroßesDatenset(data) {
const chunkSize = 1000;
const chunks = [];
for (let i = 0; i < data.length; i += chunkSize) {
const chunk = data.slice(i, i + chunkSize);
chunks.push(JSON.stringify(chunk));
}
return chunks;
}
```
---
## ⚠️ Häufige Fallstricke
### 1. Zirkuläre Referenzen
```javascript
// Problem
const obj = { name: "Test" };
obj.self = obj; // Zirkuläre Referenz
// JSON.stringify(obj); // TypeError: Converting circular structure to JSON
// Lösung
const objOhneZirkel = JSON.stringify(obj, (key, value) => {
return key === 'self' ? undefined : value;
});
```
### 2. Datenverlust bei undefined/function
```javascript
const obj = {
name: "Test",
value: undefined, // Wird entfernt
method: () => {}, // Wird entfernt
date: new Date() // Wird zu String
};
console.log(JSON.stringify(obj));
// '{"name":"Test","date":"2024-01-01T10:00:00.000Z"}'
```
### 3. Präzisionsverlust bei großen Zahlen
```javascript
const großeZahl = 9007199254740992;
const json = JSON.stringify({ zahl: großeZahl });
const parsed = JSON.parse(json);
console.log(großeZahl === parsed.zahl); // false bei sehr großen Zahlen
```
### 4. Date-Objekte werden zu Strings
```javascript
const obj = { datum: new Date() };
const json = JSON.stringify(obj);
const parsed = JSON.parse(json);
console.log(parsed.datum instanceof Date); // false
console.log(typeof parsed.datum); // "string"
// Lösung mit Reviver
const mitDatum = JSON.parse(json, (key, value) => {
return key === 'datum' ? new Date(value) : value;
});
```
---
## 🔧 Erweiterte Techniken
### Custom toJSON() Methode
```javascript
class Benutzer {
constructor(name, email) {
this.name = name;
this.email = email;
this.erstelltAm = new Date();
}
toJSON() {
return {
name: this.name,
email: this.email,
erstelltAm: this.erstelltAm.toISOString()
};
}
}
const benutzer = new Benutzer("Max", "max@example.com");
console.log(JSON.stringify(benutzer));
```
### JSON Schema Validierung
```javascript
// Einfache Schema-Validierung
function validiereMitSchema(obj, schema) {
for (const [key, type] of Object.entries(schema)) {
if (typeof obj[key] !== type) {
throw new Error(`${key} sollte vom Typ ${type} sein`);
}
}
return true;
}
const schema = {
name: 'string',
age: 'number',
active: 'boolean'
};
const daten = { name: "Anna", age: 25, active: true };
validiereMitSchema(daten, schema); // OK
```
---
## 📚 Zusammenfassung
:::success
**Wichtige Erkenntnisse:**
1. **JSON ist ein universelles Datenformat** für den Austausch zwischen Systemen
2. **`JSON.stringify()`** konvertiert JS-Objekte zu JSON-Strings
3. **`JSON.parse()`** konvertiert JSON-Strings zu JS-Objekten
4. **Fehlerbehandlung ist essentiell** beim Arbeiten mit JSON
5. **Achten Sie auf Fallstricke** wie zirkuläre Referenzen und Datenverlust
6. **Validierung und defensive Programmierung** erhöhen die Robustheit
:::
JSON ist ein mächtiges Werkzeug in der modernen Webentwicklung. Mit den richtigen Techniken und der Beachtung der Best Practices können Sie sicher und effizient mit JSON-Daten arbeiten.
---
*Diese Dokumentation wurde für HackMD optimiert und bietet eine umfassende Einführung in JSON mit JavaScript.*