Arbeiten mit JSON und dem Dateisystem in JavaScript
Arbeiten mit JSON und dem Dateisystem in JavaScript
~13 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Wir haben JSON.parse/JSON.stringify bereits mehrfach genutzt – Zeit für einen vertieften Blick, inklusive einiger Stolperfallen, die bei der Persistierung unseres Haushaltsbuchs relevant werden.
JSON.stringify() im Detail
const transaktion = { beschreibung: 'Miete', betrag: -850, kategorie: 'Wohnen' };
console.log(JSON.stringify(transaktion));
// '{"beschreibung":"Miete","betrag":-850,"kategorie":"Wohnen"}'
// Mit Einrückung für lesbare Dateien (dritter Parameter: Anzahl Leerzeichen):
console.log(JSON.stringify(transaktion, null, 2));Der zweite Parameter (replacer) erlaubt es, bestimmte Eigenschaften auszuschließen oder zu transformieren – nützlich, um z. B. interne, nicht zu persistierende Felder aus der Ausgabe fernzuhalten:
const transaktion = { beschreibung: 'Miete', betrag: -850, internerCache: { irrelevant: true } };
console.log(JSON.stringify(transaktion, ['beschreibung', 'betrag']));
// '{"beschreibung":"Miete","betrag":-850}' - internerCache ausgeschlossenWas JSON NICHT abbilden kann
JSON ist ein reines Text-Datenformat mit begrenztem Typumfang – einige JavaScript-Werte gehen beim JSON.stringify() VERLOREN oder werden UNERWARTET umgewandelt:
undefinedals Objekteigenschaft wird KOMPLETT weggelassen, in einem Array wird es zunull.function-Werte werden KOMPLETT weggelassen.Date-Objekte werden automatisch zu ISO-String umgewandelt ('2026-01-31T00:00:00.000Z'), NICHT automatisch zurück beim Parsen -JSON.parse()liefert wieder nur einen String!MapundSetwerden zu{}- ihre eigentlichen Daten gehen VOLLSTÄNDIG verloren.
Achtung: Für unser Haushaltsbuch bedeutet das konkret: Ein Datum sollte als einfacher String ('2026-01-31') gespeichert werden, wie wir es seit Kapitel 4 bereits tun – NICHT als Date-Objekt, dessen Rundreise durch JSON nur die halbe Information wiederherstellt.
JSON.parse() mit reviver: Werte beim Einlesen transformieren
const json = '{"beschreibung":"Miete","betrag":-850}';
const transaktion = JSON.parse(json, (schluessel, wert) => {
if (schluessel === 'betrag') {
return Math.round(wert); // z. B. Nachkommastellen konsequent runden
}
return wert;
});
console.log(transaktion); // { beschreibung: 'Miete', betrag: -850 }Das fs-Modul vertieft: Verzeichnisse sicherstellen
Bevor unser Haushaltsbuch in eine Datei schreibt, sollte das Zielverzeichnis existieren – mkdir mit der recursive-Option erstellt fehlende Zwischenverzeichnisse automatisch und wirft KEINEN Fehler, falls das Verzeichnis bereits existiert:
import { readFile, writeFile, mkdir } from 'node:fs/promises';
import { dirname } from 'node:path';
import { DateiNichtGefundenFehler, HaushaltsbuchFehler } from './fehler.js';
export async function ladeTransaktionen(pfad) {
try {
const inhalt = await readFile(pfad, 'utf-8');
return JSON.parse(inhalt);
} catch (fehler) {
if (fehler.code === 'ENOENT') {
throw new DateiNichtGefundenFehler(pfad);
}
throw new HaushaltsbuchFehler(`Konnte ${pfad} nicht lesen: ${fehler.message}`);
}
}
export async function speichereTransaktionen(pfad, transaktionen) {
try {
await mkdir(dirname(pfad), { recursive: true }); // Verzeichnis sicherstellen
await writeFile(pfad, JSON.stringify(transaktionen, null, 2), 'utf-8');
} catch (fehler) {
throw new HaushaltsbuchFehler(`Konnte ${pfad} nicht schreiben: ${fehler.message}`);
}
}node:path's dirname() extrahiert den Verzeichnisanteil eines Pfades (dirname('daten/transaktionen.json') ergibt 'daten') – ein weiteres eingebautes Node.js-Modul, das bei Datei-Pfad-Manipulation nützlich ist.
Eine kurze Erwähnung: robusteres Schreiben
Tipp: Für produktionsreife Systeme wird oft ZUERST in eine temporäre Datei geschrieben und DANACH umbenannt (statt die Zieldatei direkt zu überschreiben) – so bleibt bei einem Absturz MITTEN im Schreibvorgang die alte, intakte Datei erhalten, statt in einem halb geschriebenen, korrupten Zustand zu enden. Für unser Lern-Haushaltsbuch ist das direkte Schreiben ausreichend, aber gut zu wissen für spätere, echte Projekte.