• cJSON


    优点:cJSON只有cJSON.h和cJSON.c两个文件、600行代码可以直接加到工程项目中,不必编译成库使用。

    结论:优先使用cJSON


    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;


    使用过程:


    1.创建

            cJSON *cjson = cJSON_CreateObject();   //创建一个对象节点
            cJSON *cjson = cJSON_CreateArrary();    //创建一个数组
            cJSON *cjson = cJSON_CreateString(const char *ch);    //创建一个字符串类型的节点,保存ch
            cJSON *cjson = cJSON_CreateNumber(double n);    //创建一个数字类型的节点,保存n,不分整数和浮点数
            ...

            cJSON_CreateXXX内部使用malloc分配动态内存,使用完后一定调用

            cJSON_Delete(cjson);


    2.解析

            char *ch = "{"name":"rongxiaojun", "object":["xys", "hdm", "qinxiaohui, my friend", "songtao, laji"]}";
            cJSON *cjson = cJSON_Parse(ch);

       温馨提示

            a.若字符串格式不符合规范,cJSON_Parse返回0

            b.使用完后使用cJSON_Delete(cjson)进行空间释放


    3.输出

            char* ch = cJSON_Print(cJSON *cjson);

           内部用malloc为ch分配了空间,所以使用完后需free(ch)


    4.取节点

       4.1对象节点

            //取cjson中名字为"name"的子节点,故cj->string = "name"
            cJSON *cj = cJSON_GetObjectItem(cjson, "name");

        4.2数组节点

            //从cjson数组取第n个元素(数组元素也为节点)
            cJSON *cj = cJSON_GetArrayItem(cjson, n);

        温馨提示:字段不存在均返回0


    5.取值

    	char *ch = cjson->valuestring;
    	int n = cjson->valueint;
    	double d = cjson->valuedouble; 

    6.取节点名字

            char *ch = cj->string;

            注意:取名操作通常用于子节点,因为顶级节点没名所以对顶级节点取名会出错


    7.添加节点

        7.1 添加普通对象节点

            cJSON_AddStringToObject(cjson, "name", "rongxiaojun");
            cJSON_AddNumberToObject(cjson, "name", n);

        7.2 添加数组节点

            cJSON_AddItemToArray(cj, cJSON_CreateString("shilaji"));
            cJSON_AddItemToArray(cj, cJSON_CreateNumber(n));

        温馨提示:cJSON在添加数字时不区分整数和浮点数,该值被同时赋给cjson->valueint和cjson->valuedouble,用户根据需要取出对应值


    8. 删除节点

        8.1 删除普通对象节点

            删除key为name的节点

    cJSON_DeleteItemFromObject(cjson, "name");

        8.2 删除数组节点

            删除数组中第2个元素

    cJSON_DeleteItemFromArray(cjson, 2);
        温馨提示:cJSON_DeleteItemFrom*函数在删除节点时内存即清理,故不存在内存泄露问题,可放心使用。


    9.数组


    9.1 取数组个数

            int num = cJSON_GetArraySize(cj);


    9.2 取节点

    /*从cjson数组取第n个元素(数组元素也为节点)*/        
    cJSON *cj = cJSON_GetArrayItem(cjson, n);  
    //不存在返回0

    9.3 添加节点

    cJSON_AddItemToArray(cj, cJSON_CreateString("shilaji"));
    cJSON_AddItemToArray(cj, cJSON_CreateNumber(n));

    示例

    		cJSON *cjson = cJSON_CreateArray();
    		
    		cJSON_AddItemToArray(cjson, cJSON_CreateString("123456"));
    		cJSON_AddItemToArray(cjson, cJSON_CreateString("nihaihaoma"));
    		cJSON_AddItemToArray(cjson, cJSON_CreateString("jintianxingqiwule"));
    
    		int iCnt = cJSON_GetArraySize(cjson);
    		for(int i = 0; i != iCnt; ++i)
    			printf("%s
    ", cJSON_GetArrayItem(cjson, i)->valuestring);
    结果



    10.验证字段存在

            if(cJSON_GetObjectItem(cjson, str.c_str()) == NULL)
                    return false;
            else
                    return true;

    11.bool操作

            a.添加:cJSON_AddBoolToObject(cjson, "name", flag);

            b.读取:bool bRes = cJSON_GetObjectItem(cjson, "name")->type;


    //从cjson数组取第n个元素(数组元素也为节点) cJSON *cj = cJSON_GetArrayItem(cjson, n);
  • 相关阅读:
    省选测试42
    省选测试41
    省选测试40
    省选测试39
    python海龟画图生成星星
    Python-列表简介
    Linux系统中设置默认的Java版本
    虚拟机无线网卡桥接失败
    pycharm设置启动图标
    禁用vscode硬件加速
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/6775778.html
Copyright © 2020-2023  润新知