Performance & Architektur
RFC 8259RFC 9535 JSONPathCSV-ParserTypeScript-ASTOffline-PWA

JSON-Explorer & Tabellen-Entfalter – Tief verschachtelte Strukturen durchsuchen, glätten und typisieren

Tief verschachteltes JSON lokal im Browser erkunden: Pfade durchsuchen, Objekt-Arrays als Tabelle glätten, CSV reparieren und TypeScript-Typen ableiten.

LKLukas Kopischke
Zuletzt aktualisiert am
JSON-Explorer & Tabellen-Entfalter100 % Offline · 0 Bytes Upload
Beispiele:
Aktueller Pfad:
Wurzel (Ebene 0)
data (Ebene 1)
organization (Ebene 2)
store (Ebene 3)
orders (Ebene 4)
0 (Ebene 5)
Knoten-Inspektor
1{
2 "id": "ORD-2026-8841",
3 "createdAt": "2026-10-26T14:20:00Z",
4 "status": "shipped",
5 "customer": {
6 "name": "Hannah Bergmann",
7 "email": "h.bergmann@example.de",
8 "address": {
9 "city": "Hamburg",
10 "postalCode": "20457",
11 "country": "DE"
12 }
13 },
14 "payment": {
15 "method": "sepa_debit",
16 "amountEur": 249.9,
17 "paid": true,
18 "discountCode": "HERBST10"
19 },
20 "shipping": {
21 "carrier": "DHL",
22 "trackingCode": "003404341610940129",
23 "checkpoints": [
24 {
25 "hub": "Bremen GVZ",
26 "timestamp": "2026-10-26T19:05:00Z",
27 "ok": true
28 },
29 {
30 "hub": "Hamburg Süd",
31 "timestamp": "2026-10-27T05:42:00Z",
32 "ok": true
33 }
34 ]
35 },
36 "items": [
37 {
38 "sku": "NVME-2TB-PRO",
39 "title": "M.2 NVMe SSD 2 TB",
40 "qty": 1,
41 "unitEur": 169.9
42 },
43 {
44 "sku": "USB4-CABLE-1M",
45 "title": "USB4 40 Gbit/s Kabel",
46 "qty": 2,
47 "unitEur": 40
48 }
49 ]
50}
Alle Berechnungen laufen lokal im Browser – ohne Werbung oder Account-Zwang.

Eine Webhook-Antwort, ein GraphQL-Dump oder ein Zustands-Export aus deinem Smart Home ist 900 Zeilen lang und sechs Ebenen tief verschachtelt. Du scrollst im Texteditor auf und ab, zählst geschweifte Klammern und weißt in Zeile 412 nicht mehr, ob das Feld status gerade zur Bestellung, zur Zahlung oder zum Versand-Paket gehört.

Ein strukturierter JSON-Explorer zerlegt den Text nach in einen adressierbaren Objektbaum im Arbeitsspeicher, stellt jede Verschachtelungsebene als nebeneinanderliegende Spalte dar und faltet verschachtelte Objekt-Arrays über Punkt-Notation (customer.address.city) zu flachen Tabellen auseinander. Für Dateien bis etwa 20 MB gelingt das verzögerungsfrei im Browser; ab mehreren hundert Megabyte sind Streaming-Parser auf der Kommandozeile überlegen.

Merksatz

Verschachteltes JSON wird erst dann mühelos lesbar, wenn Hierarchie-Ebenen nebeneinander statt untereinander stehen und wiederholte Objekt-Listen in flache Spalten aufgefaltet werden. Jeder Knoten besitzt dabei genau einen eindeutigen Zugriffspfad von der Wurzel bis zum Wert.

Warum verlieren wir in tief verschachteltem JSON die Orientierung – und wie lösen Spalten-Navigation und Punkt-Glättung das?

In einer formatierten Textdatei wächst eine Baumstruktur gleichzeitig nach rechts (Einrückung) und nach unten (Zeilenanzahl). Sobald der Elternknoten orders[0] aus dem sichtbaren Bildschirmausschnitt verschwindet, muss dein Arbeitsgedächtnis den gesamten Pfad im Kopf behalten.

Zwei Darstellungsformen beheben dieses Strukturproblem ohne Datenverlust:

  1. : Jede Ebene der JSON-Hierarchie erhält eine eigene schmale Spalte. Klickst du links auf data, daneben auf store und daneben auf orders, bleibt die gesamte Elternkette dauerhaft im Blickfeld, während ganz rechts der isolierte Teilbaum steht.
  2. Rekursive Punkt-Glättung (Dot-Flattening): Enthält ein JSON-Dokument ein Array gleichartiger Objekte – etwa Bestellungen mit eingebettetem customer- und payment-Objekt –, projiziert ein rekursiver Durchlauf die geschachtelten Schlüssel auf zusammengesetzte Spaltennamen wie customer.email oder payment.amountEur. Aus einem verschachtelten Baum entsteht wieder eine zweidimensionale Tabelle, die sich sortieren, filtern und für Tabellenkalkulationen exportieren lässt.

Sichere Pfad-Adressierung und Tabellen-Projektion im Code

Beim Kopieren eines Pfades in eigenen TypeScript- oder JavaScript-Code scheitert die einfache Punkt-Schreibweise (a.b.c), sobald Schlüssel Bindestriche oder Leerzeichen enthalten (wie "content-type") oder optionale Zwischenobjekte zur Laufzeit null sein können. Eine saubere Hilfsfunktion prüft deshalb jeden Pfad-Abschnitt per regulärem Ausdruck und erzeugt auf Wunsch direkt sicheres Optional-Chaining (?.):

TYPESCRIPT
1const VALID_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
2
3export function buildSafeAccessPath(
4 segments: Array<string | number>,
5 useOptionalChaining = true
6): string {
7 let expr = "data";
8 for (const seg of segments) {
9 if (typeof seg === "number") {
10 expr += useOptionalChaining ? `?.[${seg}]` : `[${seg}]`;
11 } else if (VALID_IDENT.test(seg)) {
12 expr += useOptionalChaining ? `?.${seg}` : `.${seg}`;
13 } else {
14 const escaped = seg.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
15 expr += useOptionalChaining ? `?.["${escaped}"]` : `["${escaped}"]`;
16 }
17 }
18 return expr;
19}
20
21export function flattenNestedRecord(
22 record: Record<string, unknown>,
23 prefix = "",
24 maxDepth = 3
25): Record<string, string | number | boolean | null> {
26 const flat: Record<string, string | number | boolean | null> = {};
27
28 for (const [key, value] of Object.entries(record)) {
29 const column = prefix ? `${prefix}.${key}` : key;
30 if (value === null || typeof value !== "object") {
31 flat[column] = (value as string | number | boolean | null) ?? null;
32 } else if (Array.isArray(value)) {
33 flat[column] = value.every((v) => v === null || typeof v !== "object")
34 ? value.join(", ")
35 : `[${value.length} Einträge]`;
36 } else if (maxDepth > 0) {
37 Object.assign(
38 flat,
39 flattenNestedRecord(value as Record<string, unknown>, column, maxDepth - 1)
40 );
41 } else {
42 flat[column] = JSON.stringify(value);
43 }
44 }
45 return flat;
46}

Typableitung über heterogene Array-Elemente hinweg

Leitest du ein TypeScript-interface nur aus dem ersten Element orders[0] ab, übersiehst du schnell, dass discountCode in orders[1] den Wert null annimmt oder ein optionales Feld windowOpen erst im zweiten Sensor-Eintrag auftaucht. Ein verlässlicher Typ-Generator vereinigt deshalb alle Objekte eines Arrays: Taucht ein Schlüssel in weniger als 100 % der Elemente auf, erhält er das Optionalsymbol ?; kommen unterschiedliche Laufzeittypen vor (string und null), entsteht automatisch der Union-Typ string | null.

Willst du zwei verschiedene Stände derselben JSON-Antwort nach einem Deployment gegenüberstellen, nutze anschließend den Diff-Checker & Smart-Formatter, der Objektschlüssel vor dem Zeilenvergleich alphabetisch sortiert.

Wann reicht ein Browser-Explorer – und wann brauchst du Streaming-Werkzeuge?

WerkzeugklasseSinnvolle DateigrößeDatenschutz & BetriebStärkenKlare Grenze / Wann wechseln?
Lokaler Browser-Explorer (JSON.parse)Bis ~20 MB100 % lokal im RAM (kein Server-Upload)Spalten-Navigation, sofortige Pfad-Kopie, CSV-Export und TypeScript-Ableitung per KlickJSON.parse lädt den gesamten String am Stück in den Browser-Heap; ab ~50–100 MB drohen Tab-Ruckler
jq (Kommandozeile)Megabyte bis mehrere GigabyteLokal im TerminalSkriptbare Filter-Pipelines in CI/CD-Jobs, Streaming-Modus (--stream) mit minimalem SpeicherbedarfSteile Lernkurve für komplexe Filter-Syntax; keine visuelle Spalten-Exploration
DuckDB (read_json_auto)50 MB bis dutzende GigabyteLokal oder EmbeddedVolle SQL-Aggregationen (GROUP BY, JOIN) direkt auf riesigen JSON- und .jsonl-DateienFür kurzes Inspizieren einzelner API-Antworten im Alltag überdimensioniert
Bewährte Praxis bei API- & CSV-Daten
  • Beim Zugriff auf tief verschachtelte Fremd-APIs konsequent Optional-Chaining (?.) samt Fallback (??) verwenden
  • Beim CSV-Export für deutschsprachiges Excel ein (\uFEFF) voranstellen und Semikolon (;) als Trennzeichen nutzen
  • TypeScript-Typen immer über alle Elemente eines Beispiel-Arrays statt nur über items[0] ableiten
Häufige Fallstricke
  • Keine produktiven Kundendaten, Bearer-Tokens oder Webhook-Payloads in werbefinanzierte Online-JSON-Viewer mit Server-Backend einfügen
  • Keine unvalidierten JavaScript-Objektschnipsel per eval() parsen – immer striktes JSON.parse() nach gezielter Vorbereinigung nutzen
  • Keine 500-MB-Logdateien komplett in ein Browser-Textfeld kopieren, statt sie per .jsonl-Zeilenstream zu verarbeiten
Vorsicht bei großen 64-Bit-Ganzzahlen in JSON

Standard-JSON.parse() in JavaScript wandelt alle Zahlen in 64-Bit-Gleitkommazahlen (IEEE 754 double) um. Ganzzahlen oberhalb von Number.MAX_SAFE_INTEGER (9.007.199.254.740.991, etwa 64-Bit-Snowflake-IDs von Discord oder X/Twitter) verlieren dabei ihre letzten Ziffern! Solche IDs gehören in APIs zwingend als "string" übertragen.

Prüfpunkte für saubere JSON- und CSV-Verarbeitung

  • Striktheit prüfen: Stammt ein fehlerhafter Schnipsel aus einer Browser-Konsole oder Konfigurationsdatei, entferne nachgestellte Kommas und wandle einfache in doppelte Anführungszeichen um, bevor JSON.parse() läuft.
  • Null- und Optional-Fälle absichern: Prüfe in der Auto-Tabelle, welche Spalten leere Zellen (null) aufweisen, und sichere genau diese Pfade im Anwendungscode ab.
  • 64-Bit-IDs kontrollieren: Enthält die Antwort numerische IDs mit mehr als 15 Dezimalstellen, stelle sicher, dass das Backend sie als Zeichenkette ausliefert.
  • Umlaute im CSV-Export gegenprüfen: Öffne exportierte .csv-Dateien einmal real in der Ziel-Tabellenkalkulation, um Trennzeichen (; vs. ,) und UTF-8-BOM zu bestätigen.

Quellen und nächste Schritte