Vergleich von JSON-Parsing- und -Verarbeitungsbibliotheken
Fazit: Native APIs sind am schnellsten, tolerante Parser liefern Offsets. Wählen Sie nach drei Dingen: Fehlerlokalisierung, ob der Originaltext bewahrt wird und ob die Grenzen ausdrücklich sind.

Kurz gesagt: Klassifizieren Sie zuerst das Bedürfnis, dann vergleichen Sie Implementierungen – natives JSON.parse für reine Lesevorgänge, jsonc-parser, wenn Sie Offsets brauchen oder die Originalformatierung bewahren müssen, und Query- oder Patch-Bibliotheken nur dort ergänzen, wo sie nötig sind; große Bibliotheken seitenweise lazy laden und ungewartete fallen lassen.
Jede Bibliothek behauptet, „schnell, klein und vollständig“ zu sein. Was sie wirklich unterscheidet, ist, wie viel Information sie Ihnen gibt, wenn etwas schiefgeht.
1. Vier Kategorien nach Zweck
| Kategorie | Repräsentative Bibliotheken | Was sie löst |
|---|---|---|
| Standard-Parsing | JSON.parse / JSON.stringify |
Syntax ↔ Objekt, Geschwindigkeit zuerst |
| Tolerantes Parsen + Bearbeiten | jsonc-parser, json5 |
Eingabe mit Kommentaren, Fehler offsetgenau, Änderungen, die die Formatierung bewahren |
| Abfrage | jsonpath-plus, jsonpath |
Knoten nach Ausdruck auswählen |
| Mutation | fast-json-patch, immer |
Patches erzeugen/anwenden, unveränderliche Updates |
Identifizieren Sie zuerst, in welcher Kategorie Sie sind, und vergleichen Sie dann konkrete Implementierungen – sonst ist es leicht, eine Abfragebibliothek für die Arbeit eines Parsers zu verwenden.
2. Seitenweiser Vergleich
| Bibliothek | Fehlerlokalisierung | Toleranz (Kommentare/nachfolgende Kommas) | Bewahrt Originalformatierung | Geeignete Szenarien |
|---|---|---|---|---|
JSON.parse |
Nur Meldung und Position (engineabhängig) | ✗ | ✗ | Standard-Parsing, API-Daten |
jsonc-parser |
Präziser offset + Fehlercode |
✓ | ✓ (modify + applyEdits) |
Editoren, Konfigurationsdateien |
json5 |
Zeilen- und Spalteninformation | ✓ (nachsichtiger) | ✗ | JSON5-Konfiguration lesen |
jsonlint |
Zeilen- und Spalteninformation | ✗ | ✗ | Nur als Referenz, nicht aktiv gepflegt |
jsonpath-plus |
Ausdruckssyntaxfehler | — | — | Abfrage nach Ausdruck |
fast-json-patch |
Fehler auf Operationsebene | — | — | Patch-Erzeugung und -Anwendung |
lz-string |
— | — | — | JSON in eine URL komprimieren |
JSON.parse-Fehlermeldungen variieren stark zwischen Engines. V8 erzeugt etwas wie
Unexpected token } in JSON at position 42, aber ob die Position genau ist, hängt von der Engine-Version ab;
jsonc-parser liefert stattdessen ein stabiles strukturiertes { error, offset, length }, das für Editor-Marker geeignet ist.
3. Vier zentrale Entscheidungspunkte
3.1 Brauchen Sie Offsets
Bauen Sie einen Editor und wollen „Klick auf den Fehler springt zur entsprechenden Zeile“, müssen Sie einen Offset haben. Der Test ist einfach: Kann Ihre Fehlermeldung nur „ungültiges JSON“ ausgeben, müssen Nutzer selbst danach suchen.
import { parse, printParseErrorCode } from 'jsonc-parser';
const errors: Array<{ error: number; offset: number; length: number }> = [];
parse(text, errors, { allowTrailingComma: true, disallowComments: false });
if (errors.length > 0) {
const firstError = errors[0];
console.error(`${printParseErrorCode(firstError.error)} at offset ${firstError.offset}`);
}
3.2 Müssen Sie den Originaltext bewahren
Nur Werte lesen → jeder Parser genügt. „Ein Feld ändern und alles andere exakt so lassen, wie es war“ → Sie müssen eine Bearbeitungs-API verwenden, nicht „parsen → Objekt ändern → serialisieren“.
Letzteres verliert: Kommentare, Schlüsselreihenfolge (in manchen Implementierungen), Einrückungsstil, Notation numerischer Literale (1e3 wird 1000) und Escape-Formen (\u4e2d wird das tatsächliche Zeichen).
3.3 Sind die Randverhalten ausdrücklich
Prüfen Sie vor der Wahl einer Bibliothek die Dokumentation auf drei Dinge:
- Wie doppelte Schlüssel behandelt werden (den letzten behalten / einen Fehler werfen);
- Ob große Ganzzahlen Präzision verlieren (die meisten JS-Bibliotheken tun es, weil sie alle durch
Numbergehen); - Den unterstützten Umfang für BOM, Kommentare und nachfolgende Kommas.
Gibt es keine Dokumentation, schreiben Sie ein kleines Beispiel und testen Sie selbst. Das ist verlässlicher als das README zu lesen.
3.4 Wartungsstatus
Das Risiko einer JSON-Bibliothek ist nicht eine fehlende Funktion, sondern langfristige Vernachlässigung: Niemand wird mehr Sicherheitspatches ausliefern (Prototype Pollution, ReDoS).
4. Vergleich mit anderen Sprachen
| Sprache | Standardbibliothek / Mainstream-Bibliothek | Wesentlicher Unterschied |
|---|---|---|
| JavaScript | JSON.parse |
Alle Zahlen sind doppelt präzise |
| TypeScript | Wie oben + jsonc-parser / zod |
Typen existieren nur zur Kompilierzeit |
| Go | encoding/json |
Standardmäßig float64, UseNumber() zur Präzisionserhaltung; json.RawMessage für verzögertes Parsen |
| Java | Jackson / Gson / Moshi | Bei Jackson auf das Risiko von Default Typing achten |
| Python | json / orjson |
parse_float=Decimal bewahrt Präzision; orjson ist schneller, unterstützt aber nicht alle Typen |
| Rust | serde_json |
Stark typisierte Deserialisierung; das Feature arbitrary_precision bewahrt Präzision |
| C++ | simdjson / RapidJSON | simdjson zielt auf Parsing-Durchsatz, RapidJSON ist allgemeiner |
Beim sprachübergreifenden Datenaustausch sind die leichtesten Stolpersteine weiterhin Zahlenpräzision und Zeitformate; die Bibliothekswahl kann sie nur mildern, nicht beseitigen.
5. Typische Kombinationen
Option 1: Werkzeugseite (Browser-Seite)
Parsing and error location: jsonc-parser
Editor: CodeMirror 6 + @codemirror/lang-json
Query: jsonpath-plus
Patch: fast-json-patch
Share links: lz-string
Das prägende Merkmal dieser Kombination ist, dass alles lokal läuft und keine Daten hochgeladen werden, was den Datenschutzerwartungen einer Utility-Seite entspricht.
Option 2: Serverseitiges API-Gateway
Validation: Ajv (compile the schema once, reuse it)
Parsing: native JSON.parse (together with a body size limit)
Deferred parsing of large fields: keep the raw string, parse only when needed
Führen Sie im Gateway-Layer keine Query-/Patch-Bibliotheken ein, um Geschäftslogik umzusetzen – das ist die Aufgabe der Geschäftsschicht.
Option 3: CLI und Skripte
Pick fields: jq
Format conversion: yq / dasel
Interactive browsing: jless
Batch validation: ajv-cli
6. Die echte Auswirkung von Bundlegröße und Performance
jsonc-parserist sehr klein und fürs Hauptbundle geeignet;json5ist etwas größer alsjsonc-parser, weil es mehr Syntax unterstützt;jsonpath-plusenthält Ausdrucksauswertung und ist merklich größer, es sollte seitenweise lazy geladen werden;fast-json-patchist mittelgroß und nur nötig, wenn Sie eine Vergleichsfunktion haben.
Die Optimierung ist geradlinig: seitenweise dynamisch importieren und sie nicht in den First-Screen-Chunk legen.
const { JSONPath } = await import('jsonpath-plus');
7. Checkliste
- [ ] Bibliotheken nach Zweck wählen; keine Abfragebibliothek zum Parsen verwenden;
- [ ]
jsonc-parserverwenden, wenn präzise Fehlerstellen gebraucht werden; - [ ] Bearbeitungs-APIs verwenden, wenn Kommentare und Formatierung erhalten bleiben müssen;
- [ ] Die drei Randverhalten praktisch testen: doppelte Schlüssel, große Ganzzahlen und BOM;
- [ ] Wartungsstatus und Sicherheitshinweise der Bibliothek beobachten;
- [ ] Große Bibliotheken bei Bedarf dynamisch importieren.
FAQ
Wie wähle ich eine JSON-Bibliothek für meine Projektgröße?
Kleine Werkzeuge, die nur API-Daten lesen, können bei nativem JSON.parse bleiben. Projekte, die Fehlerstellen auf Editor-Niveau brauchen oder die Originalformatierung bewahren müssen, sollten jsonc-parser verwenden. Ein serverseitiges Gateway braucht nur Validierung und Parsing und überlässt Query- und Patch-Bibliotheken der Geschäftsschicht, während CLI-Skripte direkt jq, yq und ajv-cli verwenden können.
Warum zählt Wartungsstatus mehr als Funktionsumfang?
Das echte Risiko einer JSON-Bibliothek ist langfristige Vernachlässigung, nicht eine fehlende Funktion: Niemand wird Sicherheitspatches für Prototype Pollution oder ReDoS ausliefern. So vollständig die Funktionsliste auch ist, eine stehengebliebene Bibliothek lässt Sie selbst patchen. Behandeln Sie Wartung und Sicherheitshinweise als harte Kriterien, statt Funktionstabellen zu vergleichen.
Sollte ich JSON.parse verwenden, um ein Feld zu ändern und Kommentare sowie Einrückung zu behalten?
Nein. Parsen, das Objekt ändern und dann serialisieren verliert Kommentare, Schlüsselreihenfolge, Einrückungsstil, Notation numerischer Literale (1e3 wird 1000) und Escape-Formen (\u4e2d wird das tatsächliche Zeichen). Ein Feld zu ändern und alles andere intakt zu lassen erfordert eine Bearbeitungs-API wie modify und applyEdits in jsonc-parser.