C/C++实现JSON格式数据剖析

打印 上一主题 下一主题

主题 529|帖子 529|积分 1587

参考文章

保举以下几篇,针对Cjson的应用写的很详细,感谢!!!
https://blog.csdn.net/xiaopengX6/article/details/104629606
https://liang.blog.csdn.net/article/details/86605234
运用场景

在做C的项目时,对方通过TCP套接字将内容按照帧头+帧体的格式发送过来,此中帧体的内容是JSON格式的数据,就必要用C语言剖析这部分数据,在此记录一下当时的学习过程。
C 实现过程

1.第三方库下载

https://github.com/JHiroGuo/cJson
使用说明

(1)必要剖析的json数据格式
  1.         "status": 1,
  2.         "data": [{
  3.                 "city": "上海",
  4.                 "temp": {
  5.                         "high": 22.2,
  6.                         "low": 10.1
  7.                 }
  8.         }, {
  9.                 "city": "海南",
  10.                 "temp": {
  11.                         "high": 30,
  12.                         "low": 20.1
  13.                 }
  14.         }]
  15. }
复制代码
(2)剖析流程
  1. /*jsbuf:待解析的json格式的字符串*/
  2. void jsonParse(const char *jsbuf)
  3. {
  4.         cJSON* city_value = NULL;
  5.         cJSON* temp_value = NULL;
  6.         cJSON* high_value = NULL;
  7.         cJSON* low_value = NULL;
  8.         if (jsbuf == NULL )
  9.                 return;
  10.         cJSON* root = NULL;
  11.         root = cJSON_Parse(jsbuf);   //将字符串转成JSON数据
  12.         if (root == NULL)
  13.         {
  14.                 /* 字符串数据不符合json格式,打印出错误的字符串 */
  15.                 const char* err_ptr = cJSON_GetErrorPtr();  
  16.                 printf("%s\r\n", err_ptr);
  17.                 return;
  18.         }
  19. /* 解析常规对象 */
  20.         cJSON* value = cJSON_GetObjectItem(root,"status");
  21.         if (value == NULL)
  22.         {
  23.                 cJSON_Delete(root);  //删除根节点,释放内存
  24.         }
  25. /* 解析数组对象 */
  26.         value = cJSON_GetObjectItem(root,"data");
  27. /* 获取数组长度 */
  28.         uint8_t len = cJSON_GetArraySize(value);
  29.         for (int i = 0; i < len; i++)
  30.         {
  31. /*  根据下标获取对象 */
  32.                 city_value = cJSON_GetArrayItem(value,i);
  33.                 temp_value = cJSON_GetArrayItem(value,i);
  34.                 if (temp_value == NULL)
  35.                 {
  36.                         return;
  37.                 }
  38.                 city_value = cJSON_GetObjectItem(city_value,"city");
  39. /* 读取JSON对象嵌套数据temp */
  40.                 temp_value = cJSON_GetObjectItem(temp_value, "temp");
  41.                 high_value = cJSON_GetObjectItem(temp_value,"high");
  42.                 low_value = cJSON_GetObjectItem(temp_value,"low");
  43.                 printf("city:%s\r\n", cJSON_Print(city_value));   /*  把数据转成 字符串输出  */
  44.                 printf("%s\r\n%s\r\n", cJSON_GetStringValue(high_value), cJSON_GetStringValue(low_value));   /* 获取对应键值,用于打印 */
  45.         }
  46.         cJSON_Delete(root);
  47. }
复制代码
(3)运行结果
  1. city:"上海"
  2. 22.2
  3. 10.1
  4. city:"海南"
  5. 30.1
  6. 20.1
复制代码
3.其他工具保举

保举一个JSON格式校验的网站:  在线JSON校验格式化工具(Be JSON)
增补C++库实现过程

1. 资源下载

C++提供jsoncpp库可以用来剖析json格式的数据。
jsoncpp库链接
参考博客
实现流程

[code]void parse_json_cpp(const char* jsbuf,int len){        Json::Value root;        Json::Reader reader;        Json::Value array;        Json::Value temp;        if (!reader.parse(jsbuf,jsbuf+ len, root))        {                //reader将Json字符串剖析到root,root将包罗Json里所有子元素                return;        }        /* 剖析常规对象 */        int status = root["status"].asInt();        cout
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表