cJSON是一个处理json的开源C库,它有构造json和解析json文件两部分,由于还没完全摸索完,先将解析json这部分钻研下
处理json是一个用的比较多的过程,用脚本语言的话应该python最简单了,内置字典类型,想得到json文件里的key-value的话:
pf = open(json_file, ‘r’)
decode_json = json.load(pf)
print decode_json[“interfaces”][XX]
想得到什么key或者对应的value,简单就是任性!!
来瞧瞧cJSON的过程,以下是自己的理解,首先是数据结构,原封不动如下:
/* The cJSON structure: */
typedef struct cJSON {
struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
int type; /* The type of the item, as above. */
char *valuestring; /* The item’s string, if type==cJSON_String */
int valueint; /* The item’s number, if type==cJSON_Number */
double valuedouble; /* The item’s number, if type==cJSON_Number */
char *string; /* The item’s name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;
这个数据结构的表示方法有点像树里的孩子兄弟表示法
struct cJSON *next,*prev;用来表示同一级别的兄弟结点,通过双向链表来储存
struct cJSON *child;每个结点可以有孩子结点,实际上意思就是一个大的json里面,可以有子json,但是注释已经说明了结点是对象或者数组才可以有孩子结点,通过child指针来访问
int type; 是这个结构体的类型,包括有:
/* cJSON Types: */
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6
#define cJSON_IsReference 256
char *valuestring; 如果是字符串
int valueint;如果是整型数值
double valuedouble;如果是浮点数值
char *string;存放这个结点的名字
整个解析处理过程还是很复杂的,下面是一个解析已存在为json格式的文本文件,得到我需要的信息的小测试程序,调用的cJSON库,大体过程:
1:读取json文件
2:获取文件的长度,并申请内存空间
3:将文件内容读取到字符串里
4:将字符串解析成json结构体
5:遍历得到我们需要某些项的信息
#include <stdio.h>
#include <stdlib.h>
#include “cJSON.h”
void Json_Parser(char *filename){
int length;
FILE *file = fopen(filename, “r”);
fseek(file, 0, SEEK_END);
length = ftell(file);
char *text;
text = (char *)malloc(length);
fseek(file, 0, SEEK_SET);
fread(text, 1, length, file);
fclose(file);
cJSON *json = cJSON_Parse(text);
if (!json){
printf(“Error before: %s\n”, cJSON_GetErrorPtr());
return;
}
cJSON *interfaces = cJSON_GetObjectItem(json, “interfaces”);
if (interfaces){
int nic_number, i;
nic_number = cJSON_GetArraySize(interfaces);
for (i = 0; i < nic_number; i++){
cJSON *nicArrayItem = cJSON_GetArrayItem(interfaces, i);
char *nic_name = nicArrayItem->valuestring;
printf(“Nic[%d]: %s\n”, i, nic_name);
}
}
cJSON_Delete(json);
}
int main(){
Json_Parser(“pprobe.cfg”);
return 0;
}
pprobe.cfg内容:
lihui@LastWish ~ $ cat pprobe.cfg
{
“interfaces”: [ “eth0”, “eth1” ],
“cpu”: {
…………………………….
}