对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了。这个函数库就是cJSON了。这里提供了下载资源可以下载后直接用。

https://files.cnblogs.com/files/piaoyang/cJSONFiles.rar

  自己使用时可以只需要其中的cJSON.c和cJSON.h文件就可以了,只需要将cJSON和自己的main文件一起编译即可。

  主要函数接口介绍:

  这里有个很重要的结构体是需要用到的就是cJSON  结构体如下:

typedef struct cJSON {

  struct cJSON *next,*prev;      /* 遍历数组或对象链的前向或后向链表指针*/

  struct cJSON *child;                   /*数组或对象的孩子节点*/

   int type;                                     /* key的类型*/

  char *valuestring;                       /*字符串值*/

  int valueint;                                /* 整数值*/

  double valuedouble;                    /* 浮点数值*/

   char *string;                               /* key的名字*/

} cJSON;

说明:

1、cJSON是使用链表来存储数据的,其访问方式很像一颗树。每一个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。只有节点是对象或数组时才可以有孩子节点。

2、type是键(key)的类型,一共有7种取值,分别是:False,Ture,NULL,Number,String,Array,Object。

若是Number类型,则valueint或valuedouble中存储着值。若期望的是int,则访问valueint,若期望的是double,则访问valuedouble,可以得到值。

若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。

3、string中存放的是这个节点的名字,可理解为key的名称。

重要的接口函数:

1.cJSON *cJSON_Parse(const char *value);

解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。可以看做是获取一个句柄。

2.cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);

功能:获取json指定的对象成员

参数:*objec:第一个函数中获取的句柄。

string:需要获取的对象

返回值:这个对象成员的句柄  如果json格式的对象成员直接就是字符串那么就可以直接通过结构体中的valuestring元素来获取这个成员的值

3.cJSON *cJSON_GetArrayItem(cJSON *array,int item);

功能:有可能第二个函数中获取到的是成员对象值是一个数组,那么就需要用到这个函数。用来获取这个数组指定的下标对象

参数:*array:传入第二步中返回的值

    item:想要获取这个数组的下标元素

返回值:这个数组中指定下标的对象。然后在对这个返回值重复使用第二步函数就可以获取到各个成员的值了。

也就是说对象是数组的比是字符串的要多用一个cJSON_GetArrayItem函数,其他的没区别。

4.cJSON_Delete()

用来释放你第一步获取的句柄,来释放整个内存。用在解析完后调用

介绍完了下面就看实例

用于解析的json结构,这里我使用配置文件保存的json结构,然后解析这个配置文件。用于测试json结构如下:

{"syslog_db":[{"db_user":"xxx","db_password":"yyy","db_type":"ORACLE","db_ip":"172.16.1.248","db_port":"1521","db_name":"orcl","sql":"select * from syslog"}],
"syslog_source":[{"send_ip":"172.0.0.8","send_port":"8","send_protocal":"TCP"}],
"syslog_enable":"1"
}

三个大的对象分别有两个是数组一个是直接可以获取的。代码如下:

 1 #include <stdio.h>
 2 #include "cJSON.h"
 3
 4 int main() {
 5     FILE            *fp = NULL;
 6     cJSON           *json;
 7     char            *out;
 8     char            line[1024] = {0};
 9
10     if(NULL != (fp = fopen("./test.ply", "r"))) {
11         while (NULL != fgets(line, sizeof(line), fp)) {
12             json=cJSON_Parse(line); //获取整个大的句柄
13             out=cJSON_Print(json);  //这个是可以输出的。为获取的整个json的值
14             cJSON *arrayItem = cJSON_GetObjectItem(json,"syslog_db"); //获取这个对象成员
15             cJSON *object = cJSON_GetArrayItem(arrayItem,0);   //因为这个对象是个数组获取,且只有一个元素所以写下标为0获取
16
17         /*下面就是可以重复使用cJSON_GetObjectItem来获取每个成员的值了*/
18             cJSON *item = cJSON_GetObjectItem(object,"db_user");  //
19             printf("db_user:%s\n",item->valuestring);
20
21             item = cJSON_GetObjectItem(object,"db_password");
22             printf("db_password:%s\n",item->valuestring);
23
24             item = cJSON_GetObjectItem(object,"db_type");
25             printf("db_type:%s\n",item->valuestring);
26
27             item = cJSON_GetObjectItem(object,"db_ip");
28             printf("db_ip:%s\n",item->valuestring);
29
30             item = cJSON_GetObjectItem(object,"db_port");
31             printf("db_port:%s\n",item->valuestring);
32
33             item = cJSON_GetObjectItem(object,"db_name");
34             printf("db_name:%s\n",item->valuestring);
35
36             item = cJSON_GetObjectItem(object,"sql");
37             printf("db_sql:%s\n",item->valuestring);
38
39
40        /*这里这个是直接可以获取值的*/
41             arrayItem = cJSON_GetObjectItem(json,"syslog_enable");
42             printf("%s\n",arrayItem->valuestring);
43         }
44     }
45         cJSON_Delete(json);
46     close(fp);
47 }    

执行的结果如下:

转载于:https://www.cnblogs.com/piaoyang/p/9274925.html

C语言cJSON库的使用,解析json数据格式相关推荐

  1. android 解析json数据格式

    前面我有用到android发送json数据:这里我想总结一下我用到的解析json数据格式的方式 json数据格式解析我自己分为两种: 一种是普通的,一种是带有数组形式的: 普通形式的: 服务器端返回的 ...

  2. cjson 对象是json数组型结构体_C语言cJSON库的使用,解析json数据格式

    对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了.这个函数库就是cJSO ...

  3. 【C语言实用库】cJSON-解析json数据的利器

    cJSON是用于解析json格式字符串的一套api,非常好用,下面介绍一下使用方法: 1. json介绍 json中一般是"key":value的形式,而value有一共7种类型, ...

  4. android json格式解析,android之解析json数据格式详解

    1.JSON解析 (1).解析Object之一: 解析方法: 1 JSONObject demoJson =newJSONObject(jsonString); 2 String url = demo ...

  5. SqlServer解析XML,解析JSON数据格式

    一:解析XML(SQL2005版本开始支持) declare @pro_xml varchar(max)='<reg><node><pro_id>3</pro ...

  6. VBA实现企业微信API获取考勤数据,解析JSON数据格式。

    '通过微信API接口发送和获取数据 Function weixinAPI(starttime As String, endtime As String) As StringDim access_tok ...

  7. js解析json数据格式及格式转换

    JSON数据 [javascript Object Notation]JavaScript对象表示法 是一种轻量级的数据交换格式 json的数据结构 ● 一种是"名称/值"的组合 ...

  8. cjson构建_[置顶] cJSON库(构建json与解析json字符串)-c语言

    一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  9. cjson 对象是json数组型结构体_C语言 - cJSON解析特定格式 含有数组array类型的数据...

    在ESP32中使用了cJSON库,发现很好用.最近服务器端的JSON格式越来越多样,还是有些注意点,需要做下笔记记录下来. cJSON *MAC_arry = cJSON_GetObjectItem( ...

最新文章

  1. oracle decode 01427,(oracle)在DECODE中的SELECT(返回多行)
  2. UML类图与类的关系
  3. Flexible Box布局基础知识详解
  4. Cpp 对象模型探索 / 类静态成员函数的调用方式
  5. CodeForces - 1353D Constructing the Array(bfs)
  6. 西南科技计算机在线自测,西南科技大学2017春季第一学期高等数学1在线自测答案...
  7. 使用intellij查看scala变量的具体类型
  8. python实现深度优先搜索_python中的深度优先搜索算法
  9. 【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)
  10. 前端模板引擎artTemplate---高性能JavaScript模板引擎
  11. js判断数组中有没有指定元素
  12. 项目服务接口设计_Spring Boot Security 整合 OAuth2 设计安全API接口服务
  13. 笔记内容:非线性控制理论
  14. mobx中跟新了数据视图没变化_如何做一个好的大数据平台架构
  15. 歌谷服务套件gms_谷歌gms框架安装器下载-安卓9谷歌服务框架app安装-游戏大玩家...
  16. Java项目:SSM网吧计费管理系统
  17. 解决Mac自动切换输入法
  18. 苹果笔记本电脑亮度无法调节_macbook怎么调节屏幕亮度|苹果笔记本调显示器亮度方法...
  19. the voyage游戏android,Bullet Voyage
  20. Extraneous children found when component already has explicitly named default slot. These children

热门文章

  1. 在jupyter编写代码列出HTML,Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)...
  2. python 数据库查询结果邮件提醒_python读取postgresql数据库并发送相关提醒邮件
  3. vlookup使用步骤_使用vlookup出错,看看原因多为这几个!快来看看!
  4. 巴特沃斯滤波器 python_巴特沃斯、切比雪夫、贝塞尔滤波器的区别
  5. 手机应用url抓取_Python爬虫入门,快速抓取大规模数据(第六部分)
  6. android listview item按钮,android-listview适配器中的按钮
  7. linux源码gpio模拟i2c,linux内核gpio模拟i2c实例.doc
  8. Python -- abc module
  9. Java项目课程01:课程概述
  10. 2021大数据1班《Python程序设计基础》学生学期总结