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;
}
最后输出的结果如下图所示:
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容