cJSON库之解析json部分

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”: {
    …………………………….
}

发表评论