前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++读取json文件_cfile读写文件

c++读取json文件_cfile读写文件

作者头像
全栈程序员站长
发布2022-11-10 15:47:17
5.5K0
发布2022-11-10 15:47:17
举报
文章被收录于专栏:全栈程序员必看
代码语言:javascript
复制
说明:本篇文章主要参考了如下博主的内容,地址附上:(https://blog.csdn.net/shuiyixin/article/details/89330529)

一、JSON文件简介

1、什么是JSON文件?

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

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

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

二、C++从字符串中读取JSON

代码语言:javascript
复制
	在C++中读写JSON文件主要是使用JSON文件作为配置文件,为了更加深入的理解JSON文件的读写,我们先
从字符串中读取JSON,以此来加强对JSON文件的理解。

1、简单样式的JSON

代码语言:javascript
复制
首先,我们定义一个字符串,来保存如下的数据,然后读取该字符串将其解析成JSON数据格式:
代码语言:javascript
复制
{ 
   
	"name" : "weier",
	"age" : "21",
	"sex" : "man"
}
代码语言:javascript
复制
源码如下:
代码语言:javascript
复制
#include <iostream>
#include <string>
#include <json/json.h>
#include <fstream>
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;
}
}
代码语言:javascript
复制
函数解析:
(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文件

代码语言:javascript
复制
	复杂样式的JSON文件有好几个数据段,如下所示:
代码语言:javascript
复制
{ 

"name" : "weier",
"age" : 21,
"sex" : "man",
"friend" : [{ 

"name" : "lilei"
},{ 

"name" : "xiaoming"
}]
}
代码语言:javascript
复制
源码如下:
代码语言:javascript
复制
#include <iostream>
#include <string>
#include <json/json.h>
#include <fstream>
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"];
}
}
}
代码语言:javascript
复制
运行结果如下:
在这里插入图片描述
在这里插入图片描述

三、从JSON文件中读取数据

代码语言:javascript
复制
	从上述两个例子中可以大致的第JSON数据的读取有了初步的了解,但是在实际的应用中主要是读取JSON配置
文件。下例将演示如何读取JSON文件:
1、src.json配置文件:
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
2、源程序:
代码语言:javascript
复制
#include <iostream>
#include <string>
#include <json/json.h>
#include <fstream>
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();
}
代码语言:javascript
复制
3、运行结果:
在这里插入图片描述
在这里插入图片描述

四、C++写JSON文件

代码语言:javascript
复制
	在读JSON文件的基础之上,我们将读取到的结果写入一个新的JSON文件中,而不是直接输出到终端。
1、写JSON文件的源代码如下:
代码语言:javascript
复制
#include <iostream>
#include <string>
#include <json/json.h>
#include <fstream>
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();
}
代码语言:javascript
复制
2、运行结果如下:
(1)终端输出:
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
(2)生成的des.json文件:
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184006.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月9日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档