我是靠谱客的博主 平淡白昼,最近开发中收集的这篇文章主要介绍cJSON数据的解析和添加,附上完整代码,方便大家学习。JSON数据格式简答cJSON解析数据及打印显示cJSON添加数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

cJSON库的基本使用方法

  • JSON数据格式简答
    • 单个JSON
    • 多个JSON
  • cJSON解析数据及打印显示
    • JSON数据解析和打印
  • cJSON添加数据

JSON数据格式简答

单个JSON

下面先贴上一个c语言下的json文件的样式。下面的JSON样式很全,既有了子键,而且有了数组,对于初学者相对来说比较全面。这里先注意一下 最开头的中括号 “[]”,下面解析JSON的时候会介绍到。用下面的代码做测试学习的时候,可以将首尾的中括号去掉,理解一下。

const char *message =
"[{                              
    "name":"mculover666",   
    "age": 22,                
    "weight": 55.5,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 111111
        },                      
    "skill": ["c", "Java", "Python"],
    "student": false          
}]								
";

下面是一段正常的JSON数据,更易查看。

[{                              
    "name":"mculover666",   
    "age": 22,                
    "weight": 55.5,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 111111
        },                      
    "skill": ["c", "Java", "Python"],
    "student": false          
}];

多个JSON

单个JSON和多个JSON块的不同就是需要用 逗号 将各个JSON隔开,并且每个JSON都需要用 {} 隔开。

const char *message =
"[{                              
    "name":"mculover666",   
    "age": 22,                
    "weight": 55.5,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 111111
        },                      
    "skill": ["c", "Java", "Python"],
    "student": false          
},								
	{                           
    "name":"dhn",			
    "age": 23,                
    "weight": 72.6,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 222222
        },                      
    "skill": ["c", "linux", "Python"],
    "student": true          
}]";

下面同样贴上正常的JSON样式,便于观看。

[{                              
    "name":"mculover666",   
    "age": 22,                
    "weight": 55.5,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 111111
        },                      
    "skill": ["c", "Java", "Python"],
    "student": false          
},								
	{                           
    "name":"dhn",			
    "age": 23,                
    "weight": 72.6,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 222222
        },                      
    "skill": ["c", "linux", "Python"],
    "student": true          
}]";

cJSON解析数据及打印显示

JSON数据解析和打印

#include <stdio.h>
#include <iostream>
using namespace std;
#include "../cJson/cJSON.h"

const char *message =
"[{                              
    "name":"mculover666",   
    "age": 22,                
    "weight": 55.5,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 111111
        },                      
    "skill": ["c", "Java", "Python"],
    "student": false          
},								
	{                           
    "name":"dhn",			
    "age": 23,                
    "weight": 72.6,           
    "address":                
        {                       
            "country": "China",
            "zip-code": 222222
        },                      
    "skill": ["c", "linux", "Python"],
    "student": true          
}]";

//
//const char *message =
//"[{                              
//    "name":"mculover666",   
//    "age": 22,                
//    "weight": 55.5,           
//    "address":                
//        {                       
//            "country": "China",
//            "zip-code": 111111
//        },                      
//    "skill": ["c", "Java", "Python"],
//    "student": false          
//}]								
//";

int main(){
	cJSON* cjson_data = NULL;
	cJSON* cjson_name = NULL;
	cJSON* cjson_age = NULL;
	cJSON* cjson_weight = NULL;
	cJSON* cjson_address = NULL;
	cJSON* cjson_address_country = NULL;
	cJSON* cjson_address_zipcode = NULL;
	cJSON* cjson_skill = NULL;
	cJSON* cjson_student = NULL;
	int    skill_array_size = 0, i = 0;
	cJSON* cjson_skill_item = NULL;
	/* 解析整段JSO数据 */
	cjson_data = cJSON_Parse(message);
	if (cjson_data == NULL){
	//< 当JSON数据格式有错误的时候就会来到这里
		cJSON_Delete(cjson_data);
		cout << "parse json fail!" << endl;
		return -1;
	}
	//< 下面提供了两种打印数据的方法,结果会在下面贴图显示
	cout << "有格式的方式打印Json:" << endl;
	char* without_format_print = cJSON_Print(cjson_data);
	cout << without_format_print << endl;
	free(without_format_print);
	cout << "无格式的方式打印Json:" << endl;
	cout << cJSON_PrintUnformatted(cjson_data) << endl;
//< !!!!!!! 这里很重要,一定要把打印返回的结果释放掉,否则会造成内存泄漏 !!!!!!!

	//< 这里是错误的写法,因为不能直接从数据中直接寻找name的键,需要将子JSON先解析出来然后在解析。
	//< 还记得上面写的 中括号的问题吗 就在这里 【】,如果不加中括号这里是可以使用的,结果会在下面贴图。
	cjson_name = cJSON_GetObjectItem(cjson_data, "name");
	//cout << cjson_name->valuestring;

	int tint = cJSON_GetArraySize(cjson_data);
	cJSON* arr_item = cjson_data->child;//子对象
	for (int i = 0; i < tint; i++) {
		cjson_name = cJSON_GetObjectItem(arr_item, "name");
		cjson_age = cJSON_GetObjectItem(arr_item, "age");
		cjson_weight = cJSON_GetObjectItem(arr_item, "weight");
		cout << cjson_name->valuestring << "  " << cjson_age->valueint << "   " << cjson_weight->valuedouble << endl;

		/* 解析子JSON */
		cjson_address = cJSON_GetObjectItem(arr_item, "address");
		cjson_address_country = cJSON_GetObjectItem(cjson_address, "country");
		cjson_address_zipcode = cJSON_GetObjectItem(cjson_address, "zip-code");
		cout << cjson_address_country->valuestring << "  " << cjson_address_zipcode->valueint << endl;

		/* 解析数组 */
		cjson_skill = cJSON_GetObjectItem(arr_item, "skill");
		skill_array_size = cJSON_GetArraySize(cjson_skill);
		cout << "skill:[";
		for (int j = 0; j < skill_array_size; j++){
			cjson_skill_item = cJSON_GetArrayItem(cjson_skill, j);
			cout << cjson_skill_item->valuestring << ",";
		}
		cout << "b]" << endl;

		/* 解析布尔型数据 */
		cjson_student = cJSON_GetObjectItem(arr_item, "student");
		cout << (cjson_student->valueint == 0 ? "false" : "true") << endl;

		arr_item = arr_item->next;
	}

	cJSON_Delete(cjson_data);
	return 0;
}

有格式下的数据打印
在这里插入图片描述
无格式下的数据打印,相比于有格式的打印,此打印方法更加节省空间。
在这里插入图片描述

!!!!!!!,注意:一定要记得释放内存。

上面对中括号的解答。若加了中括号,利用上述代码块的单个JSON数据的解析。
在这里插入图片描述
下面是程序完整的运行结果
在这里插入图片描述

注:以上都是对已知的数据格式进行解析,若不知道文件的数据格式,可以利用cJSON结构体当中的type进行判断,
在这里插入图片描述
在这里插入图片描述

根据判断的类型,在决定数据的格式。

cJSON添加数据

添加数据比较简单,这里直接附上代码了。

#include <stdio.h>
#include "../cJson/cJSON.h"

int main()
{
	cJSON* cjson_test = NULL;
	cJSON* cjson_address = NULL;
	cJSON* cjson_skill = NULL;
	char* str = NULL;

	/* 创建一个JSON数据对象(链表头结点) */
	cjson_test = cJSON_CreateObject();

	/* 添加一条字符串类型的JSON数据(添加一个链表节点) */
	cJSON_AddStringToObject(cjson_test, "name", "mculover666");

	/* 添加一条整数类型的JSON数据(添加一个链表节点) */
	cJSON_AddNumberToObject(cjson_test, "age", 22);

	/* 添加一条浮点类型的JSON数据(添加一个链表节点) */
	cJSON_AddNumberToObject(cjson_test, "weight", 55.5);

	/* 添加一个嵌套的JSON数据(添加一个链表节点) */
	cjson_address = cJSON_CreateObject();
	cJSON_AddStringToObject(cjson_address, "country", "China");
	cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
	cJSON_AddItemToObject(cjson_test, "address", cjson_address);

	/* 添加一个数组类型的JSON数据(添加一个链表节点) */
	cjson_skill = cJSON_CreateArray();
	cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("C"));
	cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Java"));
	cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Python"));
	cJSON_AddItemToObject(cjson_test, "skill", cjson_skill);

	/* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
	cJSON_AddFalseToObject(cjson_test, "student");

	/* 打印JSON对象(整条链表)的所有数据 */
	str = cJSON_Print(cjson_test);
	printf("%sn", str);
	cJSON_Delete(cjson_test);
	return 0;
}

在挣扎一下:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!一定要记得释放内存。
在这里插入图片描述

创作不易,若对您有帮助,请不要吝啬您的点赞呦。

最后

以上就是平淡白昼为你收集整理的cJSON数据的解析和添加,附上完整代码,方便大家学习。JSON数据格式简答cJSON解析数据及打印显示cJSON添加数据的全部内容,希望文章能够帮你解决cJSON数据的解析和添加,附上完整代码,方便大家学习。JSON数据格式简答cJSON解析数据及打印显示cJSON添加数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部