lws_struct provides a lightweight method for serializing and deserializing C structs to and from JSON, and to and from sqlite3.
you provide a metadata array describing struct members one-time, then call generic apis to serialize and deserialize
supports flat structs, single child struct pointers, and unbounded arrays / linked-lists of child objects automatically using lws_dll2 linked-lists
supports boolean and C types char, int, long, long long in explicitly signed and unsigned forms
supports both char * type string members where the unbounded content is separate and pointed to, and fixed length char array[] type members where the content is part of the struct
huge linear strings are supported by storing to a temp lwsac of chained chunks, which is written into a single linear chunk in the main lwsac once the total string length is known
deserialization allocates into an lwsac, so everything is inside as few heap allocations as possible while still able to expand to handle arbitrary array or strins sizes
when deserialized structs are finished with, a single call to free the lwsac frees the whole thing without having to walk it
stateful serializaton and deserialization allows as-you-get packets incremental parsing and production of chunks of as-you-can-send incremental serialization output cleanly