読者です 読者をやめる 読者になる 読者になる

Happy My Life

日常とか技術とか

C言語からJSONを読み込む

先日から数年振りにC言語でコーディングしている。 その前はrailsだったのでコードを書く量が多くて、面倒な上、このうえなし。 それにしても、ポインタ使うの久しぶりだわ。

そんな事はどうでもいいとして。 その作成中のソフトで、外部から設定ファイルを読み込む仕様があったので、拡張性等も考慮しjson形式で定義することにした。 jsonを扱えるC言語ライブラリは、いくつかあるのだが、今回はJSON-Cをチョイス。 だが、JSON-Cのサンプルコードがググってもなかなか無い(他のライブラリでも似たようなものだが) それはそれ、こことか参考にしながら、とりあえずjsonフォーマットが自由自在にパースできるところまできた。 これで何とかなりそう。

ついでにテストで作ったコードを晒してみる。

こんな情報を知りたがる人がいるかどうか不明だが、ないよりは良いだろうということで。 あ、そうそう、コンパイラはg++で。

 #include 
 #include 
 #include 
 #include "json.h"
 int main(int argc, char** argv) {
 struct json_object *obj;
 struct json_object *srv, *cli;
 int i;
 char buf[] = "{"SERVER":{"host": "192.168.0.2", "port":1287},"CLIENT":[["192.168.0.3",1001,"CLIENT1"],["192.168.0.4",1002,"CLIENT2"]]}";
int len;
 mc_set_debug(1);
 obj = json_tokener_parse(buf);
 printf("new_obj.to_string()=%sn", json_object_to_json_string(obj));
 srv =json_object_object_get(obj, "SERVER");
 cli =json_object_object_get(obj, "CLIENT");
 printf("srv.to_string()=%sn", json_object_to_json_string(srv));
 printf("cli.to_string()=%sn", json_object_to_json_string(cli));
 json_object_object_foreach(srv, key,val)
 {
 printf("t%s: %sn",key,json_object_to_json_string(val));
 }
 len = json_object_array_length(cli);
 printf("cli.length: %dn",len);
 struct json_object *ary;
 struct array_list *ary_list;
 for (i = 0; i < len; i++)
 {
 ary = json_object_array_get_idx(cli, i);
 printf("ary.to_string()=%sn", json_object_to_json_string(ary));
 char *str;
 int ary_len;
 ary_list = json_object_get_array(ary);
 ary_len = array_list_length(ary_list);
 printf("ary_length: %dn",ary_len);
 char *ipaddr;
 ipaddr = json_object_get_string((struct json_object *)array_list_get_idx(ary_list,0));
 printf("ipaddr: %sn",ipaddr);
 int portno;
 portno = json_object_get_int((struct json_object *)array_list_get_idx(ary_list,1));
 printf("portno: %dn",portno);
 char *pcname;
 pcname = json_object_get_string((struct json_object *)array_list_get_idx(ary_list,2));
 printf("pcname: %sn",pcname);
 }
 return (EXIT_SUCCESS);
 }