IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> cJSON数据的解析和添加,附上完整代码,方便大家学习。 -> 正文阅读

[大数据]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("%s\n", str);
	cJSON_Delete(cjson_test);
	return 0;
}

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

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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:00:53  更:2021-12-14 16:00:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:05:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码