検索条件
全1件
(1/1ページ)
ついったで、C言語によるJSONパーサーの話題をチラ見した。
静的に型付けされてる言語でJSONをどう扱うかっていうのが結構難しいよね。
とりあえずぱっと思いつくのはこういうモデル?
/* json parser */ #include <stdio.h> typedef enum { E_JSON_TYPE_NULL, E_JSON_TYPE_BOOLEAN, E_JSON_TYPE_NUMBER, E_JSON_TYPE_STRING, E_JSON_TYPE_ARRAY, E_JSON_TYPE_OBJECT, } e_json_type_t; typedef struct t_json { e_json_type_t type; size_t length; union { char as_boolean; long long as_number; wchar_t as_string[1]; size_t as_array; size_t as_object; }; } json_t; inline int as_int(const json_t *o) { assert(o->type == E_JSON_TYPE_NUMBER); return (int)o->as_number; }
as_arrayとかas_objectのときは、そこに書いてあるsize_t分、後続のjson_tが格納されてると見なす、みたいな?
配列やオブジェクトのパースの時には事前に長さがわからないので、ランダムアクセスさせるデータ構造は作れないような気がする。
でも、上に書いたような線形リストっぽい実装しちゃうと、後からのトラバースでいちいち中見ないといけなくて面倒だよね。
obj[3][2] は、 obj->child->next->next->next->child->next->next って展開されるからアクセスも遅そうだし。
んー。メモリプールを二つに分けて、数値と文字列と真偽値みたいな葉をひたすらため込むプールとそこへのポインタをため込むプールにわける?
ポインタをため込むプールの方は1要素のサイズが固定できて添え字によるランダムアクセスしやすくなる。
案外奥が深いよね。
CでまともにTwitter Clientとか作ろうと思ったらめんどそう。