Tech News
← Back to articles

Sj.h: A tiny little JSON parsing library in ~150 lines of C99

read original related products more articles

A tiny little JSON parsing library

~150 lines of C99

Zero-allocations with minimal state

Error messages with line:column: location

location No number parsing: strtod , atoi ? Handle them how you want

, ? Handle them how you want No string parsing: bring your own unicode surrogate pair handling (or don't)

Usage

A small program to load a rectangle from a JSON string into a Rect struct:

char * json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }" ; typedef struct { int x , y , w , h ; } Rect ; bool eq ( sj_Value val , char * s ) { size_t len = val . end - val . start ; return strlen ( s ) == len && ! memcmp ( s , val . start , len ); } int main ( void ) { Rect rect = { 0 }; sj_Reader r = sj_reader ( json_text , strlen ( json_text )); sj_Value obj = sj_read ( & r ); sj_Value key , val ; while ( sj_iter_object ( & r , obj , & key , & val )) { if ( eq ( key , "x" )) { rect . x = atoi ( val . start ); } if ( eq ( key , "y" )) { rect . y = atoi ( val . start ); } if ( eq ( key , "w" )) { rect . w = atoi ( val . start ); } if ( eq ( key , "h" )) { rect . h = atoi ( val . start ); } } printf ( "rect: { %d, %d, %d, %d }

" , rect . x , rect . y , rect . w , rect . h ); return 0 ; }

... continue reading