美文网首页
2020-01-08 cJSON使用

2020-01-08 cJSON使用

作者: 14cat | 来源:发表于2020-01-08 21:24 被阅读0次

    [TOC]

    cJSON 库只有 cJSON.c、cJSON.h 这两个文件,非常方便引入到项目中,而其中的方法也非常简单,看看头文件,自己写个例子测试一下,基本就可以满足日常工作需求了

    0. 看代码回忆

    存入和取出

    int main()
    {
        char *str_arr = NULL;
        char *str_obj = NULL;
    
        // ================= JSON 对象转换为字符串 =================
        // 创建 JSON 数组
        cJSON *json_arr = cJSON_CreateArray();
    
        // 创建 JSON 对象
        cJSON *json_obj = cJSON_CreateObject();
    
        // 解析后用来存放的 JSON
        cJSON *json_arr_parse = NULL;
        cJSON *json_obj_parse = NULL;
        cJSON *json_item_parse = NULL;
    
        // 向 JSON 对象中添加键值对内容
        cJSON_AddStringToObject(json_obj, "key01", "value01");
        cJSON_AddNumberToObject(json_obj, "key02", 2);
        cJSON_AddBoolToObject(json_obj, "key03", true);
        cJSON_AddTrueToObject(json_obj, "key04");
        cJSON_AddFalseToObject(json_obj, "key05");
        cJSON_AddNullToObject(json_obj, "key06");
    
    
        // 将 JSON 对象添加到 JSON 数组中
        cJSON_AddItemToArray(json_arr, json_obj);
    
        // 将 JSON 对象的内容格式化后存入字符串中
        str_obj = cJSON_Print(json_obj);
        printf("str_obj:%s\n", str_obj);
    
        // 将 JSON 数组的内容格式化后存入字符串中
        str_arr = cJSON_Print(json_arr);
        printf("str_arr:%s\n", str_arr);
    
        // 根据key修改值
        cJSON_ReplaceItemInObject(json_obj, "key01", cJSON_CreateString("666666"));
        // 不能这么修改,类型不一致
        //cJSON_ReplaceItemInObject(json_obj, "key05", cJSON_CreateString("666666"));
        str_arr = cJSON_Print(json_arr);
        printf("str_arr:%s\n", str_arr);
    
    
        // ================= 字符串解析为 JSON 对象 =================
        json_arr_parse = cJSON_Parse((const char *)str_arr);
        
        // 从 json 数组中取值
        json_obj_parse = cJSON_GetArrayItem(json_arr_parse, 0);
    
        // 从 json 对象中取值
        json_item_parse = cJSON_GetObjectItem(json_obj_parse, "key02");
    
        printf("json-key:%s\n", json_item_parse->string);
        printf("json-type:%d\n", json_item_parse->type);
    
        /* */
        switch (json_obj_parse->type) {
            case 1: // false
                printf("false\n");
                break;
            case 2: // true
                printf("true\n");
                break;
            case 4:// null
                printf("null\n");
                break;
            case 8: // int
                printf("int\n");
            case 16:    // 字符串
                printf("string\n");
                break;
            case 32:    // 数组
                printf("array\n");
                break;
            case 64:    // 对象
                printf("object\n");
                break;
        } 
        printf("json-value:%s\n", json_item_parse->valuestring);
    
     
    
        // 释放 JSON 对象,可以释放整个内存
        cJSON_Delete(json_arr);
    
        return 0;
    }
    

    1. cJSON 的结构体

    typedef struct cJSON {
    
        struct cJSON *next,*prev;       /* 遍历数组或对象链的前向或后向链表指针*/
    
        struct cJSON *child;            /*数组或对象的孩子节点*/
    
        int type;                       /* key的类型*/
    
        char *valuestring;              /*字符串值*/
    
        int valueint;                   /* 整数值*/
    
        double valuedouble;             /* 浮点数值*/
    
        char *string;                   /* key的名字*/
    
    } cJSON;
    

    2. cJSON 的修改对应值

    看了头文件和几篇文件都没有找到修改对应值方法,于是找源码发现了这一段

    #define cJSON_AddStringToObject(object,name,s)  cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
    
    cJSON *cJSON_CreateString(const char *string)   {
        cJSON *item=cJSON_New_Item();
        if(item){
            item->type=cJSON_String;
            item->valuestring=cJSON_strdup(string);
        }
        return item;
    }
    

    实际上文字不是直接填入 cJSON 中,而是通过将值包裹到 cJSON 的 item 中,所以我使用这个方法自己创造一个 cJSON 对象进行替换就能达到替换值

    cJSON_ReplaceItemInObject(json_obj, "key01", cJSON_CreateString("666666"));
    

    参考资料

    参考资料
    cJSON:简单好用的C语言JSON库

    C语言cJSON库的使用,解析json数据格式

    cJSON库的简单介绍及使用

    相关文章

      网友评论

          本文标题:2020-01-08 cJSON使用

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