- Sj.h ist ein ultraleichter JSON-Parser mit nur etwa 150 Zeilen, der in C99-basierten Umgebungen eingesetzt werden kann
- Zu den Merkmalen gehören keine Speicherallokationen und ein minimaler Zustand, was ihn für leichtgewichtige Embedded-Umgebungen oder minimale Abhängigkeiten geeignet macht
- Für das Parsen von Zahlen und Strings verfolgt die Bibliothek einen Ansatz mit direkter Verarbeitung, sodass Nutzer die entsprechende Logik frei selbst implementieren können
- Unterstützung für Fehlermeldungen auf Basis von Zeile:Spalte erhöht Lesbarkeit und Positionsgenauigkeit beim Debugging
- Als Public-Domain-Software darf sie von jedem frei verwendet, verändert und verteilt werden
Projektvorstellung
- Sj.h ist eine C99-Header-Datei, die JSON-Parsing mit minimalem Code bereitstellt, ohne überladene Funktionen oder unnötige Speicherallokationen
- Die gesamte Implementierung umfasst rund 150 Zeilen und eignet sich für Embedded-Systeme, Tools oder Szenarien, in denen Abhängigkeiten von externen Bibliotheken reduziert werden sollen
Hauptmerkmale
- Arbeitet mit zero-allocations und minimal state, wodurch der Speicherbedarf sehr gering bleibt
- Fehlermeldungen mit Zeile:Spalte-Informationen erleichtern das Auffinden von Problemen während des Parsens
- Zahlen-Parsing wird nicht standardmäßig mitgeliefert; stattdessen können Nutzer Verfahren wie strtod, atoi oder andere gewünschte Methoden verwenden
- String-Parsing kann ebenfalls direkt selbst implementiert werden, einschließlich Verarbeitung von Unicode-Surrogate-Pairs nach Bedarf
- Der gesamte Quellcode wird als Public Domain (Unlicense) bereitgestellt und kann ohne Lizenzbeschränkungen verwendet oder geändert werden
Anwendungsbeispiel
- Es wird ein einfaches Beispiel gezeigt, das einen JSON-String in eine
Rect-Struktur parstchar *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - Verwendet eine einfache und klare API mit sj_Reader, sj_Value, sj_reader, sj_read, sj_iter_object usw.
- Parsen numerischer Werte oder Vergleiche von Schlüssel-Wert-Paaren müssen selbst implementiert werden (keine builtin-Funktionen vorhanden)
- Im Ordner
demofinden sich verschiedene weitere Anwendungsbeispiele
Lizenz
- Sj.h ist Public-Domain-Software, die jeder ohne Einschränkungen nutzen kann
- Weitere Details stehen in der Datei
LICENSE
Sonstiges
- Durch den einfachen Code und die übersichtliche Ordnerstruktur lässt sich die Bibliothek ohne zusätzliche Konfiguration oder Build-Schritte direkt verwenden
- Sie ist unabhängig, hat keine externen Abhängigkeiten und eignet sich vor allem für Umgebungen, in denen Leichtgewichtigkeit und einfache Nutzung wichtig sind
1 Kommentare
Hacker-News-Kommentare
.ini-Konfigurationsdateien), json.lua (eine leichtgewichtige JSON-Bibliothek für Lua), lite (ein leichtgewichtiger Texteditor in Lua), cmixer (ein portabler Audio-Mixer für Spiele), uuid4 (eine kleine uuid4-Bibliothek in C)intauf 64 Bit umstellen. Aber auch dann stirbt es irgendwann, wenn die Eingabe größer als2^64ist. Ich habe nicht vor, im Code jeden einzelnenint-Overflow zu prüfen.int32 Bit hat, tritt das Problem nur auf, wenn man auf einer einzelnen Zeile eine Verschachtelungstiefe von 2 Milliarden hat, eine Datei mit mehr als 2 Milliarden Zeilen oder eine einzelne Zeile mit mehr als 2 Milliarden Zeichen.]als auch}zum Schließen von Objekten oder Arrays und behandelt auch\vals Whitespace, ist also toleranter als der Standard. Man sollte sie eher als „Datenextraktor für korrektes JSON“ sehen. Allerdings kann es lästig sein, selbst einen String- oder Number-Parser zu schreiben, besonders wenn man sich mit dem Produzenten auf ein Teilset der JSON-Syntax einigen muss.floatoderintumwandelt und man so etwas selbst ergänzen müsste. Trotzdem beeindruckend, und ich würde es wohl verwenden. Ich wollte nur darauf hinweisen.= { 0 }fehlt. Im betreffenden Code könnter->depthuninitialisiert sein und in der Schleife vonsj__discard_untilzufällig denselben Wert wiedepthhaben.r->depthist hier bereits mit 0 initialisiert, siehe betreffender Code.stdbool.hundstddef.hfür Typdefinitionen eingebunden). Keine C++-Template-Spielereien, und die API ist direkt verständlich. C-Bibliotheken, die all diese Anforderungen erfüllen, sind wirklich selten, in C++ noch seltener.