Linux下使用cJSON解析json数据包

1.json的基本知识,别问我,我也不熟。

2.cJSON,从网上下的,原地址我也忘了。最后会附上附件源码。fj.pngcJSONFiles.zip

3.功能,cJson实现比较简单,接口提供的很全面,所有文件就一个源文件和一个头文件,便于移植和使用。其中包括一个测试demo

4.格式解析,假设从http收到的text内容如下:

点击(此处)折叠或打开

  1. {
  2. data : [
  3. {
  4. plateNum : '鄂A00001',
  5. type : '1',
  6. effectiveDuration : 7200,
  7. },{
  8. ...
  9. }
  10. ],
  11. statusCode : 200,
  12. statusMsg : '操作成功'
  13. }
     从整个数据来看,可以先将数据看成:

点击(此处)折叠或打开

  1. {
  2.  data:****
  3.  statusCode:***
  4.  statusMsg:***
  5. }
可以先将 text解析成一个json格式的数据:

点击(此处)折叠或打开

  1. char *out;cJSON *json;
  2.     
  3.     json=cJSON_Parse(text);
  4.     if (!json) {printf("Error before: [%s]\n",cJSON_GetErrorPtr());}
  5.     else
  6.     {
  7.         out=cJSON_Print(json);
  8.         cJSON_Delete(json);
  9.         printf("%s\n",out);
  10.         free(out);
  11.     }
如果要分别获取三个成员变量的数据可以么? 答案是:没问题。

点击(此处)折叠或打开

  1.         cJSON *retJsonRoot = NULL, *sJsonCode = NULL, *data = NULL;
  2.         retJsonRoot = cJSON_Parse(text);
  3.         if(!retJsonRoot){
  4.             debugE("Cannot parse return data:%s\n", cJSON_GetErrorPtr());
  5.             goto exit;
  6.         }
  7.         sJsonCode = cJSON_GetObjectItem(retJsonRoot, "statusCode");
  8.         if(!sJsonCode){
  9.             debugE("Cannot parse return data:%s\n", cJSON_GetErrorPtr());
  10.             goto exit;
  11.         }
  12.         statusCode = sJsonCode->valuestring;
  13.         if(strcmp(statusCode, "200") != 0){
  14.             debugE("Check interface Error, statusCode : %s!!\n", statusCode);
  15.             goto exit;
  16.         }
  17.         data = cJSON_GetObjectItem(retJsonRoot, "data");
  18.         if(!data){
  19.             debugE("Cannot parse return data:%s\n", cJSON_GetErrorPtr());
  20.             goto exit;
  21.         }
现在对于一级的内容已经得到了,但是data里面的数据还没有提取出来,并且data中的成员变量数目也不知道,这种数据cJSON接口能够胜任么,答案是:没问题。
我们可以用下面的接口来获取data中的成员数目:

点击(此处)折叠或打开

  1. /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
  2. extern cJSON *cJSON_GetArrayItem(cJSON *array,int item)
然后就可以循环获取data中的成员。

点击(此处)折叠或打开

  1.             for(int iv = 0; iv < subNums; iv++){
  2.                 dataObj = cJSON_GetArrayItem(data, iv);
  3.                 if(!dataObj)
  4.                     goto exit;
  5.                 if(cJSON_GetObjectItem(data, "plateNum"))
  6.                     plateNum = cJSON_GetObjectItem(data, "plateNum")->valuestring;

  7.                 if(cJSON_GetObjectItem(data, "type"))
  8.                     type = cJSON_GetObjectItem(data, "plateNum")->valuestring;

  9.                 if(cJSON_GetObjectItem(data, "effectiveDuration"))
  10.                     effectiveDuration = cJSON_GetObjectItem(data, "effectiveDuration")->valuestring;
  11.             }


5.字符串的JSON格式化:
    这个demo里面有现成的,很好理解。


总结:cJson的代码很简洁,注释、说明都很清晰,另外cJson的基本数据结构使用的是链表。我在这里没有对cJson进行深入的分析,原因是:我不会。以后看懂了会继续更新。另外原demo我已经找不到了,以后找到了连接也会更新到文章里。

cJson下载链接: http://sourceforge.net/projects/cjson/files/?source=navbar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值