美文网首页
利用cJSON解析和创建JSON字符串

利用cJSON解析和创建JSON字符串

作者: only_cherry | 来源:发表于2018-09-05 11:27 被阅读0次

    一、前言:
    为了使用简单方便,可以通过下载cJSON文件来解析JOSN字符串比较简单方便,而且cJSON文件只有一个cJSON.c和cJSON.h两个文件,使用起来效率比较高。

    二、cJSON文件源码下载:
    链接:https://pan.baidu.com/s/1hZl12FqMJsfxkocU2ULBTg 密码:xi67

    三、使用说明:将下载到的文件解压出来,里面只有cJSON.c、cJSON.h两个文件,把其拷贝到工程项目文件中编译使用即可。

    四、解析JOSN字符串:

    使用例子:
    解析一个简单的键值对字符串:
    {
    "key": "value"
    }
    其中字符串中健为key,值为value。

    在cJSON.h中有为cJSON的结构体和和三个函数:
    typedef struct cJSON {
    struct cJSONnext,prev; /* 遍历数组或对象链的前向或后向链表指针*/
    struct cJSON child; /数组或对象的孩子节点 /
    int type; /
    key的类型 */
    char valuestring; /字符串值 /
    int valueint; /
    整数值 /
    double valuedouble; /
    浮点数值 */
    char string; / key的名字 */
    } cJSON;

    cJSON *cJSON_Parse(const char *value); //将JSON字符串转换成cJSON结构体
    cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);//在cJSON结构体中查找某个键的名称(key)
    void cJSON_Delete(cJSON *c);//释放cJSON结构体指针

    使用如下:
    char *str = "{"key":"value"}";// 花括号里面的(")前面必须加(),将其转换为转义字符,以免和c语言字符串冲突
    char *root = NULL, *ret = NULL;
    root = cJSON_Parse(str);//将cJSON字符串转换为cJSON结构体指针
    ret = cJSON_GetObjectItem(root, "key");//在root结构体中查找"key"这个键(一个字符串),成功返回一个cJSON结构体,失败返回NULL。
    printf("%s\n", ret->valuestring);//打印出来的结果是value
    cJSON_Delete(root);//释放cJSON结构体
    3.解析复杂一点的cJSON结构体:
    {
    "json": {
    "num": -1,
    "num_1": 0,
    "num_2": 1,
    "string": "str",
    "string_1": "abcd",
    "string_2": "123abc123"
    },
    "string": "str",
    "num": 2
    }
    同样使用上面那三个函数搞定:
    /******************************解析cJSON**************************/
    char str = "{"json": {"num": -1,"num_1": 0,"num_2": 1,"string": "str","string_1": "abcd","string_2": "123abc123"},"string": "str","num": 2}";
    char root = NULL, ret = NULL, json = NULL;//定义三个cJOSN结构体指针
    root = cJSON_Parse(str);//将cJSON字符串转换为cJSON结构体指针
    json = cJSON_GetObjectItem(root, "json");//在root结构体中查找"josn"
    /
    --------------------------解析"json"---------------------------
    /
    ret = cJSON_GetObjectItem(json, "num");//在josn结构体中查找"num"
    printf("%d\n", ret->valueint);//打印出来的结果是-1
    ret = cJSON_GetObjectItem(json, "num_1");//在josn结构体中查找"num_1"
    printf("%d\n", ret->valueint);//打印出来的结果是0
    ret = cJSON_GetObjectItem(json, "num_2");//在josn结构体中查找"num_2"
    printf("%d\n", ret->valueint);//打印出来的结果是1
    ret = cJSON_GetObjectItem(json, "string");//在josn结构体中查找"string"
    printf("%s\n", ret->valuestring);//打印出来的结果是str
    ret = cJSON_GetObjectItem(json, "string_1");//在josn结构体中查找"string_1"
    printf("%s\n", ret->valuestring);//打印出来的结果是abcd
    ret = cJSON_GetObjectItem(json, "string_2");//在josn结构体中查找"string_2"
    printf("%s\n", ret->valuestring);//打印出来的结果是123abc123
    /
    -------------------------------解析"json" end-----------------------
    /
    json = cJSON_GetObjectItem(root, "string");//在root结构体中查找"string"
    printf("%s\n", ret->valuestring);//打印出来的结果是str
    ret = cJSON_GetObjectItem(root, "num");//在root结构体中查找"num"
    printf("%d\n", ret->valueint);//打印出来的结果是2
    /******************************解析cJSON end**************************/
    cJSON_Delete(root);//释放总的cJSON结构体只需要释放cJSON_Parse函数创建的cJOSN结构体即可
    4.解析JSON结构体数组:
    再多用到两个函数:
    int cJSON_GetArraySize(cJSON array);//获取JSON数组的大小
    cJSON
    cJSON_GetArrayItem(cJSON *array,int item); //获取数组下标的成员
    解析复杂更一点的JSON结构体和JSON结构体:
    {
    "array": [{
    "num_0": 0,
    "string_0": "str0"
    },
    {
    "num_1": 1,
    "string_1": "str1"
    },
    {
    "num_2": 2,
    "string_2": "str2"
    }
    ]
    }
    char *str = "{"array": [{"num_0": 0,"string_0": "str0"},{"num_1": 1,"string_1": "str1"},{"num_2": 2,"string_2": "str2"}]}";
    char *root = NULL, *ret = NULL, *arr = NULL, *json = NULL;//定义4个cJOSN结构体指针
    int size = 0;//用于存储数组大小
    /******************************解析cJSON**************************/
    root = cJSON_Parse(str);//将cJSON字符串转换为cJSON结构体指针
    arr= cJSON_GetObjectItem(root, "array");//在root结构体中查找"array"

    size = cJSON_GetArraySize(arr);//此时size值为3
    /-------------------------1------------------------------------/
    json= cJSON_GetArrayItem(arr, 0);//获取数组第1个成员
    ret = cJSON_GetObjectItem(json, "num_0");//在josn结构体中查找"num_0"
    printf("%d\n", ret->valueint);//打印出来的结果为:0
    ret = cJSON_GetObjectItem(json, "string_0");//在josn结构体中查找"string_0"
    printf("%s\n", ret->valuestring);//打印出来的结果为:str0
    /-------------------------1 end-------------------------------/
    /-------------------------2------------------------------------/
    json= cJSON_GetArrayItem(arr, 1);//获取数组第2个成员
    ret = cJSON_GetObjectItem(json, "num_1");//在josn结构体中查找"num_1"
    printf("%d\n", ret->valueint);//打印出来的结果为:1
    ret = cJSON_GetObjectItem(json, "string_1");//在josn结构体中查找"string_1"
    printf("%s\n", ret->valuestring);//打印出来的结果为:str1
    /-------------------------2 end-------------------------------/
    /-------------------------3------------------------------------/
    json= cJSON_GetArrayItem(arr, 2);//获取数组第3个成员
    ret = cJSON_GetObjectItem(json, "num_2");//在josn结构体中查找"num_1"
    printf("%d\n", ret->valueint);//打印出来的结果为:2
    ret = cJSON_GetObjectItem(json, "string_2");//在josn结构体中查找"string_2"
    printf("%s\n", ret->valuestring);//打印出来的结果为:str2
    /-------------------------3 end-------------------------------/
    cJSON_Delete(root);//释放cJSON结构体
    /******************************解析cJSON end**************************/

    五、创建JOSN字符串:
    1.创建json字符串需要用到一下几个函数:
    extern cJSON *cJSON_CreateObject(void);//创建一个cJSON结构体指针,并给其分配空间
    cJSON_AddNumberToObject(object,name,n)//这是一个宏函数,创建一个整形健值对。
    cJSON_AddStringToObject(object,name,s)//这是一个宏函数,创建一个字符串类型健值对。
    extern char *cJSON_Print(cJSON *item);//将cJSON结构体转换为cJSON字符串(带格式)增加一些换行和空格
    extern char *cJSON_PrintUnformatted(cJSON item);//将cJSON结构体转换为cJSON字符串(不带格式)不进行换行和空格
    1.例子:比如我们要创建{"key": "value"}一个这样的JSON字符串,需要一下几步:
    /
    ========================创建开始===========================/
    cJSON root = NULL;
    char out = NULL;
    root = cJSON_CreateObject();//创建一个cJSON结构体指针并分配空间,然后赋值给root
    cJSON_AddStringToObject(root, "key", "value");//在root结构体中创建一个健为"key",值为" value"的键值对
    out = cJSON_Print(root);//将cJSON结构体转换为字符串(带格式)增加一些换行和空格
    printf("%s\n", out);//打印结果如下:
    {
    "key": "value"
    }
    /**********使用完需要释放空间**************/
    free(out);//释放malloc分配的空间
    /***********************************************/
    out = cJSON_PrintUnformatted(root);//将cJSON结构体转换为字符串(不带格式)不进行换行和空格
    printf("%s\n", out);//打印结果如下:
    {"key": "value"}
    /**********使用完需要释放空间**************/
    free(out);//释放malloc分配的空间
    cJSON_Delete(root );//释放cJSON结构体指针
    /***********************************************/
    /
    ========================创建结束=========================
    /
    2.创建一个稍微复杂一点的json字符串:
    {
    "json": {
    "num": -1,
    "num_1": 0,
    "num_2": 1,
    "string": "str",
    "string_1": "abcd",
    "string_2": "123abc123"
    },
    "string": "str",
    "num": 2
    }
    需要增加一个函数:
    extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);//在cJSON结构体里面创建cJSON结构体
    /************************************创建开始*****************************************/
    cJSON *root = NULL, *json = NULL;
    root = cJSON_CreateObject();//创建一个cJSON结构体指针并分配空间,然后赋值给root
    cJSON_AddItemToObject(root, "json", json = cJSON_CreateObject());//在root结构体中创建一个健为"json",值为json结构体的键值对
    cJSON_AddNumberToObject(json , "num", -1);//在json 结构体中创建一个健为"num",值为 -1的键值对
    cJSON_AddNumberToObject(json , "num_1", 0);//在json 结构体中创建一个健为"num_1",值为 0的键值对
    cJSON_AddNumberToObject(json , "num_2",1);//同上
    cJSON_AddStringToObject(json , "string", "str");//在json 结构体中创建一个健为"string",值为" str"的键值对
    cJSON_AddStringToObject(json , "string_1", "abcd");//同上
    cJSON_AddStringToObject(json , "string_2", "123abc123");//同上

    cJSON_AddStringToObject(root, "string", "str");//在root结构体中创建一个健为"string",值为" str"的键值对
    cJSON_AddNumberToObject(root, "num", 2);//在root结构体中创建一个健为"num",值为 2的键值对
    out = cJSON_Print(root);//将cJSON结构体转换为字符串(带格式)增加一些换行和空格
    printf("%s\n", out);//打印结果如下:
    {
    "json": {
    "num": -1,
    "num_1": 0,
    "num_2": 1,
    "string": "str",
    "string_1": "abcd",
    "string_2": "123abc123"
    },
    "string": "str",
    "num": 2
    }
    /**********使用完需要释放空间**************/
    free(out);//释放malloc分配的空间
    /***********************************************/
    out = cJSON_PrintUnformatted(root);//将cJSON结构体转换为字符串(不带格式)不进行换行和空格
    printf("%s\n", out);//打印结果如下:
    {"json": {"num": -1,"num_1": 0,"num_2": 1,"string": "str","string_1": "abcd","string_2": "123abc123"},"string": "str","num": 2}
    /**********使用完需要释放空间**************/
    free(out);//释放malloc分配的空间
    cJSON_Delete(root );//释放cJSON结构体指针
    /***********************************************/
    /========================创建结束=========================/
    3.最后再来创建一个数组:
    {
    "array": [{
    "num_0": 0,
    "string_0": "str0"
    },
    {
    "num_1": 1,
    "string_1": "str1"
    },
    {
    "num_2": 2,
    "string_2": "str2"
    }
    ]
    }
    需要增加两个个函数:
    extern cJSON *cJSON_CreateArray(void);//创建一个cJSON结构体数组
    extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);//在cJSON结构体中增加cJSON结构体数组
    /************************************创建数组开始*************************************/
    cJSON *root = NULL, *arr = NULL, *jsonr = NULL;
    char *out = NULL;
    root = cJSON_CreateObject();
    cJSON_AddItemToObject(root, "array", arr = cJSON_CreateArray());//在root结构体中创建一个健为"array",值为arr结构体数组的键值对
    /************************添加数组第一个成员开始************************************/
    json = cJSON_CreateObject();
    cJSON_AddNumberToObject(json , "num_0", 0);//在json 结构体中创建一个健为"num_0",值为 0的键值对
    cJSON_AddStringToObject(json , "string_0", "str0");//在json 结构体中创建一个健为"string_0",值为 "str0"的键值对
    cJSON_AddItemToArray(arr, json);//将json结构体加入到arr数组中
    /************************添加数组第一个成员结束************************************/
    /************************添加数组第二个成员开始************************************/
    json = cJSON_CreateObject();
    cJSON_AddNumberToObject(json , "num_1", 1);
    cJSON_AddStringToObject(json , "string_1", "str1");
    cJSON_AddItemToArray(arr, json);
    /************************添加数组第二个成员结束************************************/
    /************************添加数组第三个成员开始************************************/
    json = cJSON_CreateObject();
    cJSON_AddNumberToObject(json , "num_2", 2);
    cJSON_AddStringToObject(json , "string_2", "str2");
    cJSON_AddItemToArray(arr, json);
    /************************添加数组第三个成员结束************************************/
    out = cJSON_Print(root);
    printf("%s\n", out);//打印结果如下:
    {
    "array": [{
    "num_0": 0,
    "string_0": "str0"
    },
    {
    "num_1": 1,
    "string_1": "str1"
    },
    {
    "num_2": 2,
    "string_2": "str2"
    }
    ]
    }
    free(out);//释放malloc分配的空间
    cJSON_Delete(root );//释放cJSON结构体指针
    /************************************创建数组结束*************************************/

    六、删除JSON键值对或数组:
    由于删除比较简单,不举例说明。简单介绍一下用到的两个函数两个函数:
    extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);//从cJSON结构体中删除一个键值对
    extern void cJSON_DeleteItemFromArray(cJSON *array,int which);//从cJSON结构体数组中删除一个数组下标成员
    注意:假如数组里面10个成员,每删除一个下标,数组整体会往前移,建议从后面往前面遍历删除。

    相关文章

      网友评论

          本文标题:利用cJSON解析和创建JSON字符串

          本文链接:https://www.haomeiwen.com/subject/tmzgwftx.html