json-c(转载)

来源:互联网 发布:淘宝达人发帖图片范本 编辑:程序博客网 时间:2024/06/06 04:39


转载自:http://zengriguang.blog.163.com/blog/static/17076248720121080187635/


现在JSON解析库满天飞,没有必要再自己写个了,除非是商业程序  。我试过JsonCPP, QJson, Json-Spirit, jaula等C++的库。遇到总总问题,有不支持中文(UTF-8编码也不行)、不方便在Windows下编译、体积过于臃肿等毛病,最终的选择是C库 json-c,因为Google看到一篇文章对JSON的各个C库的优点比较,说Json-C兼容性最好,而且支持中文(使用UTF-8)。

 

最初的目的,系统间传递数据用,如结构体转变成json就可以在系统间传递,避免了诸如边界对齐,字长字短,大头小头等等问题。有时人们使用XML,XML太复杂了,处理起来性能较差。json在大多数情况下可以取代XML从而提高系统性能。

 

就json来说,由于结构比较简单,不用库也是可以的。
但json-c提供了超出json范围的一些功能,实际上完成了数据序列化和反序列化,数据的存储和检索,数据对象化等功能。还是非常有使用价值的。缺点是鲁棒性还有缺陷,异常使用容易崩溃。
需要对它进行一些修改,增加参数合理性检查什么的。

 

错误处理:

      在linux下编译开源的json-c-0.9库,在json对象不符合标准格式时,引发segmentation fault问题,程序退出。没有任何响应,这实在是让人无语。
     经发现与json_tokener_parse() 失败有很大关系。

1. 错误的情况
这里先复习一下json提取子对象的一般过程,先parse,再get object,
     json_object *newobj=NULL;
    newobj = json_tokener_parse(mystr);
    if(NULL==newobj)//错误
   {
       printf("json parse err!");
       break;
   }
   json_object *sub_obj=json_object_object_get(newobj, "name333");//因为name333不存在,所以出错! segmetation fault了,程序在这里直接崩溃

      错在哪里呢?原来是在NULL==newobj这里。libjson这个库对parse错误的判断方法是is_error()宏,
#define is_error(ptr) ((unsigned long)ptr > (unsigned long)-4000L)
不得不抱怨一下这奇怪的判断方法,但是它就是这么规定的。

   2. 正确的情况:
再写一个正确的:
 const char *mystr="{\"studentid\":\"123\", \"name\":\"Jacky\", \"info\":[{\"age\":18},{\"sex\":\"male\"}]}";
  new_obj = json_tokener_parse(mystr);
  if( is_error(new_obj) ) //正确
  {
      printf("oh, my god. json_tokener_parse err\n");
  }
  else
  {
     printf("object parse okay\n");

     json_object *sub1obj = json_object_object_get(new_obj, "name");
      if(NULL==sub1obj) //这里就要用NULL判断了, 得不到对应的object就是NULL
      {
          printf("sub1obj err\n");
      }
      else
      {
        printf("sub1obj:%s\n", json_object_to_json_string(sub1obj));
        json_object_put(sub1obj);
      }
   //----------------
        json_object *sub2obj = json_object_object_get(new_obj, "info");
      if(NULL==sub2obj)
      {
           printf("sub2obj err\n");
      }
      else
      {
        printf("sub2obj:%s\n", json_object_to_json_string(sub2obj));
        json_object_put(new_obj);
      }
  }//else end
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 坐完摇椅想吐怎么办 玩完过山车想吐怎么办 做了过山车想吐怎么办 坐车后恶心想吐怎么办 太胖了想减肥怎么办 被集资诈骗的人怎么办 教了作业没写怎么办 移动4g网速慢怎么办 小孩装病不去上学怎么办 卖衣服顾客嫌贵怎么办 当顾客说再看看怎么办 读完高中没考上大学怎么办 手抖不会写字了怎么办 字认识写不出来怎么办 八四把衣服发黄怎么办 孩孑在学校被打怎么办 在学校有人打我怎么办 孩子在学校不爱说话怎么办 孩子上幼儿园不和小朋友玩怎么办 遇到有人要打你怎么办 被表白了怎么办神回复 学校要发展我该怎么办 如果有人要打你怎么办 梦见有人要杀我怎么办 如果有人要杀我怎么办 梦到有人要杀我怎么办 感觉有人要杀我怎么办 我很自卑 没自信怎么办 如果在学校被打怎么办 如果有人打我该怎么办 别人要砍我我怎么办 专四两次没过怎么办 3岁宝宝害羞胆小怎么办 人太老实被欺负怎么办 在外面被欺负了怎么办 同学们老欺负我怎么办 孩子在学校受欺负怎么办 来例假吃了螃蟹怎么办 流产后受风头疼怎么办 种鸽配种无精怎么办 有钱但不舍得花怎么办