CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

C++之JSON文件的操作-免费源码丞旭猿

JSON(JavaScript Object Notation) 是Douglas crockford于21世纪初指定的一种轻量级的数据交换格式,既易于人们阅读和编写,也易于机器的解析和生成。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯,因此其成为了理想的数据交换语言。

本篇主要讲解了使用C++语言对JSON文件进行的操作,包括环境配置、文件读取、文件写入。

一、环境配置

(一)jsoncpp库的下载

虽然Github上可以下载到最新版本,但是我按照网上的教程配了好久都没有成功,所以还是推荐大家使用这个较老版本的库文件,这里我给大家提供了百度网盘分享链接,提取码是wasd,欢迎大家下载。

(二)基于Visual Studio2019的环境配置

这个老版本的配置方式较为简单,只需要添加相应的头文件即可。

(1)将文件中的include和src文件夹拷贝到vs工程的目录下。

(2)在工程属性栏附加包含目录中添加include的路径。

(3)在工程文件栏添加上述src下lib_json下的cpp文件。

二、写入文件

这里我们先给出整体代码,输出结果如本篇开始所示,我们主要介绍基于类似于c++map的方式(以后简称map)和父子节点的形式。

include 
include 
include 

using namespace std;

int main() {

	//根节点
	Json::Value root;
	root["Group Name"] = "Togehter";
	root["Number"] = 2;

	//Map形式
	root["Students"]["Zhangsan"].append(180);
	root["Students"]["Zhangsan"].append(70);

	root["Students"]["Lisi"].append(165);
	root["Students"]["Lisi"].append(50);

	//父子节点形式
	Json::Value student;
	student["Zhangsan"].append(180);
	student["Zhangsan"].append(70);

	student["Lisi"].append(165);
	student["Lisi"].append(50);
	
	root["Students"] = student;

	//格式化输出到文件  
	ofstream os;             //实例化输出类
	os.open("test.json", std::ios::out); //打开并指定文件以输出方式打开(往文件里写)
	if (!os.is_open())               //检查文件打开情况
		cout << "open file failed" << endl;
	Json::StyledWriter sw;      //定义格式化输出
	os << sw.write(root);       //输出到文件  
	os.close();                 //关闭文件

	return 0;
}

1. 首先定义根节点,针对一级子对象可以直接使用map的形式进行操作,这里若直接使用=进行赋值,则默认该变量为一个数或字符串;若使用append则默认该变量为向量的形式。

Json::Value root;
root["Group Name"] = "Togehter";
root["Number"] = 2;

2. 针对含有二级对象的内容,可以使用以下两种方式:

(1)map形式,这种方式较为简单,但缺点就是只能处理相对比较简单的二级对象。

在一级对象后直接跟不同的二级对象作为区分,并针对二级对象进行赋值或添加的操作。

root["Students"]["Zhangsan"].append(180);     //添加身高信息
root["Students"]["Zhangsan"].append(70);      //添加体重信息

root["Students"]["Lisi"].append(165);         //添加身高信息
root["Students"]["Lisi"].append(50);          //添加体重信息

(2)父子节点的形式,这种方法可以定义更为复杂的形式,缺点就是定义起来较为麻烦。

定义子节点,然后按照与根节点相同的方式对子节点进行处理,最后将其链接到根节点即可。

Json::Value student;                //定义子节点
student["Zhangsan"].append(180);
student["Zhangsan"].append(70);

student["Lisi"].append(165);
student["Lisi"].append(50);
	
root["Students"] = student;         //将子节点链接到根节点上

三、读取文件

读取文件较为简单,这里就不展开详细讲解啦,大家可以参考下面的注释,上整体代码。

include 
include 
include 

using namespace std;

int main() {

	Json::Reader reader;
	Json::Value root;

	ifstream is("test.json", ios::binary);  //打开文件,以二进制方式打开文件
	if (!is.is_open())               //检查文件打开情况
		cout << "open file failed" << endl;

	if (reader.parse(is, root)) {
		//读取根节点信息
		string group_name = root["Group Name"].asString();
		int number = root["Number"].asInt();
		cout << "Group Name: " << group_name << endl;
		cout << "Number: " << number << endl;

		//读取子节点信息
		int body[2];   //身高、体重
		/********注意遍历json数组的时候要使用unsigned int的变量********/
		body[0] = root["Students"]["Zhangsan"][(unsigned int)0].asInt();     
		body[1] = root["Students"]["Zhangsan"][(unsigned int)1].asInt();
		cout << "Zhangsan height:" << body[0] << " weight: " << body[1] << endl;

		body[0] = root["Students"]["Lisi"][(unsigned int)0].asInt();
		body[1] = root["Students"]["Lisi"][(unsigned int)1].asInt();
		cout << "Lisi height:" << body[0] << " weight: " << body[1] << endl;
	}
	is.close();
	return 0;
}

最后输出的结果如下图所示:

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容