目录
cJSON介绍
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
cJSON,目前来说,就只有两个文件,一个cJSON.c 一个cJSON.h文件。使用的时候,自己创建好一个main.c文件后,将头文件include进去。
主要的结构体介绍
这里有个很重要的结构体是需要用到的就是cJSON 结构体如下:
typedef struct cJSON {
struct cJSON *next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩子节点*/
int type; /* key的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
cJSON主要API
API | 说明 |
---|---|
cJSON_Version() | 获得cJSON的版本 |
cJSON_InitHooks() | 初始化cJSON_Hooks结构体 |
cJSON_Parse() | 将字符串解析成cJSON结构体 |
cJSON_ParseWithOpts() | 使用一些配置解析字符串 |
cJSON_Print() | 将cJSON结构体转换成格式化的字符串 |
cJSON_PrintUnformatted() | 将cJSON结构体转换成未格式化的字符串 |
cJSON_PrintBuffered() | 将cJSON结构体使用buffer的字符串,格式化可选 |
cJSON_Delete() | 删除cJSON结构体 |
cJSON_GetArraySize() | 返回Array类型的大小,对Object类型也是有效的 |
cJSON_GetArrayItem() | 返回Array类型的index的值,对Object类型也有效 |
cJSON_GetObjectItem() | 使用key获得对应的value |
cJSON_HasObjectItem() | 判断是否ObjectItem存在 |
cJSON_IsInvalid() | 类型判断 |
cJSON_IsFalse() | 类型判断 |
cJSON_IsTrue() | 类型判断 |
cJSON_IsBool() | 类型判断 |
cJSON_IsNull() | 类型判断 |
cJSON_IsNumber() | 类型判断 |
cJSON_IsString() | 类型判断 |
cJSON_IsArray() | 类型判断 |
cJSON_IsObject() | 类型判断 |
cJSON_IsRaw() | 类型判断 |
cJSON_free() | cJSON的free函数,调用free函数 |
使用例子
待解析的文件:
{"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"
}
代码:
#include <stdio.h>
#include "cJSON.h"
int main() {
FILE *fp = NULL;
cJSON *json;
char *out;
char line[1024] = {0};
if(NULL != (fp = fopen("./test.ply", "r"))) {
while (NULL != fgets(line, sizeof(line), fp)) {
json=cJSON_Parse(line); //获取整个大的句柄
out=cJSON_Print(json); //这个是可以输出的。为获取的整个json的值
cJSON *arrayItem = cJSON_GetObjectItem(json,"syslog_db"); //获取这个对象成员
cJSON *object = cJSON_GetArrayItem(arrayItem,0); //因为这个对象是个数组获取,且只有一个元素所以写下标为0获取
/*下面就是可以重复使用cJSON_GetObjectItem来获取每个成员的值了*/
cJSON *item = cJSON_GetObjectItem(object,"db_user"); //
printf("db_user:%s\n",item->valuestring);
item = cJSON_GetObjectItem(object,"db_password");
printf("db_password:%s\n",item->valuestring);
item = cJSON_GetObjectItem(object,"db_type");
printf("db_type:%s\n",item->valuestring);
item = cJSON_GetObjectItem(object,"db_ip");
printf("db_ip:%s\n",item->valuestring);
item = cJSON_GetObjectItem(object,"db_port");
printf("db_port:%s\n",item->valuestring);
item = cJSON_GetObjectItem(object,"db_name");
printf("db_name:%s\n",item->valuestring);
item = cJSON_GetObjectItem(object,"sql");
printf("db_sql:%s\n",item->valuestring);
/*这里这个是直接可以获取值的*/
arrayItem = cJSON_GetObjectItem(json,"syslog_enable");
printf("%s\n",arrayItem->valuestring);
}
}
cJSON_Delete(json);
close(fp);
}