菜鸟笔记
提升您的技术认知

c 对json文件的读写-ag真人游戏

说明:本篇文章主要参考了如下博主的内容,地址附上:(https://blog.csdn.net/shuiyixin/article/details/89330529)

一、json文件简介

1、什么是json文件?

	json文件是一种文本文件,一种配置文件,它具有严格的编写规则,这样可以是使用者更好的阅读和使用该类型
文件。它的编写规则如下:json文件使用花括号括起来,代表一段数据,这段数据里面可以有多个字段。每个字段
的结构有点类似于map容器,一个key对应一个value。字段名必须用双引号包围,而字段的值可以是多种类型,例如
浮点型、整形、字符串类型,甚至可以是一个新的数据段,就数据的嵌套。

2、json文件与其他文件存储数据对比

(1)与txt文件对比,json文件的格式更加明确,获取信息更加方便。
(2)与xml文件对比,json格式更加简介,存储同样的文件,所占用的内存更小。
(3)与数据库对比,json更加方便,数据库的使用需要安装软件、搭载环境。

二、c 从字符串中读取json

	在c  中读写json文件主要是使用json文件作为配置文件,为了更加深入的理解json文件的读写,我们先
从字符串中读取json,以此来加强对json文件的理解。

1、简单样式的json

首先,我们定义一个字符串,来保存如下的数据,然后读取该字符串将其解析成json数据格式:
{
  
	"name" : "weier",
	"age" : "21",
	"sex" : "man"
}
源码如下:
#include 
#include 
#include 
#include 
using namespace std;
void readjsonfromstr();
int main()
{
  
	readjsonfromstr();
	return 0;
}
void readjsonfromstr()
{
  
	const char* str = "{\"name\":\"weier\",\"age\":21,\"sex\":\"man\"}";
	json::reader reader;
	json::value root;
	if (reader.parse(str, root))
	{
  
		string name = root["name"].asstring();
		int age = root["age"].asint();
		string sex = root["sex"].asstring();
		cout << '{' << endl;
		cout << '\t' << "\"name\"" << '\t' << ':' << '\t' << name << ',' << endl;
		cout << '\t' << "\"age\"" << '\t' << ':' << '\t' << age << ',' << endl;
		cout << '\t' << "\"sex\"" << '\t' << ':' << '\t' << sex << endl << '}' << endl;
	}
}
函数解析:
(1)json::reader,这个类是用来解析json文件的,这个类非常重要。
(2)json::value,这个类代表了json的一段数据。
(3)reader是json::reader类对象,root相当于一段json数据,reader.parse(str, root)的作用是,将字符串str
	按照json格式去解析,将解析成功的数据存放在root当中。
(4)此时,root对象就相当于整个json文件数据段的根节点,所有的数据都可以通过root和键值来获取。
运行结果如下:

2、读取复杂样式的json文件

	复杂样式的json文件有好几个数据段,如下所示:
{
  
	"name" : "weier",
	"age" : 21,
	"sex" : "man",
	"friend" : [{
  
		"name" : "lilei"
		},{
  
		"name" : "xiaoming"
		}]
}
源码如下:
#include 
#include 
#include 
#include 
using namespace std;
void readjsonfromstr();
int main()
{
  
	readjsonfromstr();
	return 0;
}
void readjsonfromstr()
{
  
	const char* str = "{\"name\":\"weier\",\"age\":21,\"sex\":\"man\",\"friend\":[{\"name\":\"lilei\"},{\"name\":\"xiaoming\"}]}";
	json::reader reader;/*用于按照json数据格式,对字符串进行解析*/
	json::value value;
	if (reader.parse(str, value))
	{
  
		string myname = value["name"].asstring();
		int myage = value["age"].asint();
		string mysex = value["sex"].asstring();
		cout << "用户信息:" << endl;
		cout << myname << endl;
		cout << myage << endl;
		cout << mysex << endl << endl;
		/*解析嵌套数据*/
		cout << "朋友" << endl;
		const json::value arrvalue = value["friend"];
		for (int i = 0; i < arrvalue.size(); i  )
		{
  
			cout << arrvalue[i]["name"];
		}
	}
}
运行结果如下:

三、从json文件中读取数据

	从上述两个例子中可以大致的第json数据的读取有了初步的了解,但是在实际的应用中主要是读取json配置
文件。下例将演示如何读取json文件:
1、src.json配置文件:
2、源程序:
#include 
#include 
#include 
#include 
using namespace std;
void readdatafromjson();
int main()
{
  
	readdatafromjson();
	return 0;
}
void readdatafromjson()
{
  
	json::reader reader;/*用于按照json数据格式进行解析*/
	json::value root;/*用于保存json类型的一段数据*/
	
	ifstream srcfile("resource/src.json", ios::binary);/*定义一个ifstream流对象,与文件demo.json进行关联*/
	if (!srcfile.is_open())
	{
  
		cout << "fail to open src.json" << endl;
		return;
	}
	/*将demo.json数据解析到根节点root*/
	if (reader.parse(srcfile, root))
	{
  
		/*读取根节点信息*/
		string myname = root["name"].asstring();
		string mysex = root["sex"].asstring();
		int myage = root["age"].asint();
		cout << "我的信息" << endl;
		cout << "name : " << myname << endl;
		cout << "sex : " << mysex << endl;
		cout << "age : " << myage << endl;
		/*读取数组信息*/
		cout << "hobbies : ";
		for (int i = 0; i < root["hobby"].size(); i  )
		{
  
			string hob = root["hobby"][i].asstring();
			cout << hob << '\t';
		}
		cout << endl << endl;
		/*读取子节点信息*/
		cout << "我的朋友" << endl;
		for (int i = 0; i < root["friend"].size(); i  )
		{
  
			cout << "name : " << root["friend"][i]["name"].asstring() << endl;
			cout << "sex : " << root["friend"][i]["sex"].asstring() << endl;
			cout << "age : " << root["friend"][i]["age"].asint() << endl << endl;
		}
	}
	srcfile.close();
}
3、运行结果:


四、c 写json文件

	在读json文件的基础之上,我们将读取到的结果写入一个新的json文件中,而不是直接输出到终端。
1、写json文件的源代码如下:
#include 
#include 
#include 
#include 
using namespace std;
void writedatatojson();
int main()
{
  
	writedatatojson();
	return 0;
}
void writedatatojson()
{
  
	json::value root;/*json文件的根节点*/
	/*根节点的属性*/
	root["name"] = json::value("weier");
	root["age"] = json::value(21);
	root["sex"] = json::value("man");
	/*数组形式*/
	root["hobby"].append("sing");
	root["hobby"].append("dance");
	root["hobby"].append("eat");
	/*子节点*/
	json::value friend1;
	friend1["name"] = json::value("lilei");
	friend1["sex"] = json::value("man");
	friend1["age"] = json::value(20);
	
	json::value friend2;
	friend2["name"] = json::value("xiaohua");
	friend2["sex"] = json::value("women");
	friend2["age"] = json::value(22);
	/*将子节点挂在根节点上*/
	root["friend"].append(friend1);
	root["friend"].append(friend2);
	/*缩进输出到终端*/
	json::styledwriter sw;
	cout << sw.write(root) << endl << endl;
	/*输出到json文件*/
	ofstream desfile("resource/des.json", std::ios::out | std::ios::app);
	if (!desfile.is_open())
	{
  
		cout << "fail to pen des.jons";
		return;
	}
	desfile << sw.write(root);
	desfile.close();
}
2、运行结果如下:
(1)终端输出:
(2)生成的des.json文件:
网站地图