Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154917
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-09 13:04
个人简介

人若是没有理想,那跟咸鱼有什么区别!

文章分类

全部博文(24)

文章存档

2018年(1)

2017年(2)

2016年(8)

2015年(11)

2014年(2)

我的朋友

分类: C/C++

2015-05-30 14:18:05

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

2.cJSON,从网上下的,原地址我也忘了。最后会附上附件源码。cJSONFiles.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下载链接:

阅读(4896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~