JSON篇:Linux下cJSON编程

使用cJSON使C语言支持JSON数据

由于C语言本身不支持JSON数据,所以我们可以通过cJSON使得C语言支持JSON格式的数据。
cJSON作为Json格式的解析库,其主要功能是构建和解析Json报文,用途就是一端将要发送的数据用cjson形式封装,然后发送,另一端收到此数据后,还是以cjson形式解析,就得到想要的数据了。

cJSON结构体

typedef struct cJSON {  
 struct cJSON *next,*prev;   
 struct cJSON *child;   
 int type;   
 char *valuestring;   
 int valueint;  
 double valuedouble;   
 char *string;   
} cJSON; 

1.cJSON存储的时候是采用链表存储的,其访问方式很像一颗树。每一个节点可以有兄妹节点,
通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。
不过,只有节点是对象或数组才可以有孩子节点。
2.type一共有7种取值,分别是:
#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
若是Number类型,则valueint或valuedouble中存储着值,若你期望的是int,则访问valueint,若期望的是double,则访问valuedouble,可以得到值;
若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。
3、string中存放的是这个节点的名字。

使用

cJSON 开源项目位置:  http://sourceforge.net/projects/cjson/
cJSON,目前来说,就只有两个文件,一个cJSON.c 一个cJSON.h文件。
用法:只需在函数中includecJSON.h头文件,然后和cJSON.c或库文件libcJSON.a一起编译即可使用。
在linux上,使用命令进行编译:
gcc cJSON.c test.c -o test -lm

重要函数说明

【1】两个创建
【创建JSON对象】cJSON *cJSON_CreateObject(void);
【创建JSON数组】cJSON *cJSON_CreateArray(void);
【2】两种添加
【向对象中添加】voidcJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
【向数组中添加】void cJSON_AddItemToArray(cJSON *array, cJSON *item);

【3】常用几招
【向对象中增加数字】cJSON_AddItemToObject(root, “value”, cJSON_CreateNumber(value));
【向对象中增加文件】cJSON_AddItemToObject(root, “string”, cJSON_CreateString(string));

【4】JSON嵌套
【向对象中增加数组】cJSON_AddItemToObject(root, “rows”, rows = cJSON_CreateArray());
【向数组中增加对象】cJSON_AddItemToArray(rows, row = cJSON_CreateObject());

cJSON_CreateObject函数可创建一个根数据项,之后便可向该根数据项中添加string或int等内容;
cJSON_AddNumberToObject向节点中添加子节点;
cJSON_Print函数可以打印根数据项,加入制表符换行符等标识符使得JSON数据包更易阅读;
使用free函数释放被out占用的内存空间

下列序号一样的代表效果一样:


a.cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value)); 
a.cJSON_AddNumberToObject(root, "value", value); 

b.cJSON_AddItemToObject(root, "name", cJSON_CreateString(name));
b.cJSON_AddStringToObject(root, "name",name);

实际操作

1.创建一个对象,并向这个对象里添加字符串和整型键值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

//创建一个对象,并向这个对象里添加字符串和整型键值
int main(int argc, char **argv)
{
    cJSON *usr = NULL;

    //创建根数据对象
    usr = cJSON_CreateObject();
    //加入键值,加字符串
    cJSON_AddStringToObject(usr,"name","xiaoming");
    cJSON_AddStringToObject(usr,"age","20");
    //加入整数
    cJSON_AddNumberToObject(usr,"num",123);

    //将json形式打印成正常的字符串形式
    char *out = cJSON_Print(usr);
    printf("%s\n",out);


    //释放内存
    cJSON_Delete(usr);
    free(out);

    return 0;
}

执行结果
JSON篇:Linux下cJSON编程_第1张图片
2.创建一个数组,并向数组添加一个字符串和一个数字

int create_js(void)
{
    cJSON *root = NULL;
    root = cJSON_CreateArray();
    cJSON_AddItemToArray(root, cJSON_CreateString("Hello world"));
    cJSON_AddItemToArray(root, cJSON_CreateNumber(2019));

    //char *s = cJSON_PrintUnformatted(root);
    char *s = cJSON_Print(root);
    if(s){
            printf(" %s \n",s);
            free(s);
         }

    if(root)
        cJSON_Delete(root);

    return 0;
}

int main(int argc, char **argv)
{
    create_js();
    return 0;
}

执行结果
在这里插入图片描述
3.对象里面包括一个字符串和一个对象1,对象1里面添加一个字符串和一个数字


int create_js(void)
{
    cJSON *root = NULL;
    cJSON *js_body = NULL;
    cJSON *js_list = NULL;
    root = cJSON_CreateObject();
    cJSON_AddItemToObject(root,"最外层",js_body = cJSON_CreateObject());
    cJSON_AddItemToObject(js_body,"Rule",js_list = cJSON_CreateObject());
    cJSON_AddStringToObject(js_list,"name","xiaoming");
    cJSON_AddStringToObject(js_body,"enable","true,false");
    cJSON_AddNumberToObject(js_list,"age",20);


    char *s = cJSON_Print(root);
    //char *s = cJSON_PrintUnformatted(root);
    if(s)
    {
        printf(" %s \n",s);
        free(s);
    }
    if(root)
        cJSON_Delete(root);
    return 0;
}


int main(int argc, char **argv)
{
    create_js();
    return 0;
}

执行结果

JSON篇:Linux下cJSON编程_第2张图片

你可能感兴趣的:(cJSON,Linux编程,JSON结构体,JSON库函数,具体实例实现,JSON)