在上一篇博客我讲解了使用c 读取xml文件,在这篇博客中我将讲解解析json文件。在解析json文件时我使用的解析库是jsoncpp,编译平台是vs2019。希望看完本篇博客能对你有所帮助。
在学习解析json文件之前,我们应该先了解什么是json。
json简介:
json(javascript object notation, js 对象简谱) 是一种轻量级的数据交换格式。它基于 ecmascript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
- json: javascript object notation(javascript 对象表示法)
- json 是存储和交换文本信息的语法,类似 xml。
- json 比 xml 更小、更快,更易解析。
- json 易于人阅读和编写。
- c、python、c 、java、php、go等编程语言都支持 json。
json的实例如下:
{
"sites": [
{
"name":"百度" , "url":"www.baidu.com" },
{
"name":"google" , "url":"www.google.com" },
{
"name":"微博" , "url":"www.weibo.com" }
]
}
json语法:
- 数据在 名称/值 对中
- 数据由逗号 , 分隔
- 使用斜杆来转义 \ 字符
- 大括号 {} 保存对象
{
"name":"baidu", "alexa":10000, "site":null }
- 中括号 [] 保存数组,数组可以包含多个对象
[ "google", "baidu", "taobao" ]
如果想学习更多关于json文件的知识,可以点击菜鸟教程学习。
解析json文件我们需要网上开源的库,在这里我用的是jsoncpp库。jsoncpp库的配置相比于tinyxml2稍难,不过按照步骤来就好。
- 首先下载jsoncpp,可以点击jsoncpp下载。
- 下载好之后,解压到本地文件,我们解析json文件一般只需要文件中的include文件和src文件。如图:
- 创建解析json文件的工程,然后把这两个文件复制到工程目录中。下图是复制好的文件:
- 配置项目的依赖库
右击项目 -》属性 -》c\c -》常规 -》附加包含目录,添加依赖,就是刚才你放的include文件目录地址,每个人都不一样,如图所示:
这一步就是引用库文件,引用出差错一般会#include标红,注意头文件引用的绝对路径就行。
5. 把src文件中lib_json下的.cpp文件导入目录,如图所示:
这样就配置好了,配置完过后,可能会有头文件引用标红,分别添加相应依赖就可以了。
读取json文件之前,首先要了解jsoncpp库中的两个类:value和reader。
在这里我就不多讲了,可以参考这篇博客:
value、reader
读取简单字符串
定义简单的字符串保存json数据
{
"name" : "shuiyixin",
"age" : "21",
"sex" : "man"
}
读取代码如下:
void readstrjson()
{
//字符串
string str =
"{\"name\":\"shuiyixin\",\"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 << name "," << age << "," << sex << endl;
}
}
读取复杂字符串
json数据如下:
{
"name":"shuiyixin",
"major":[
{
"ai":"machinelearning"
},
{
"ai":"deeplearning"
},
{
"ai":"computervision"
}]
}
代码如下:
void readstrprojson()
{
string strvalue =
"{\"name\":\"wangqinghe\",\"major\":[{\"ai\":\"machinelearning\"},{\"ai\":\"deeplearning\"},{\"ai\":\"picturelearning\"}]}";
json::reader reader;
json::value value;
if (reader.parse(strvalue, value))
{
string str = value["name"].asstring();
cout << "name:" <
读取json文件
文件名为demo.json,内容如下:
{
"age" : "22",
"bro" : {
"friend_age" : "25",
"friend_name" : "wangwenjian",
"friend_sex" : "man"
},
"hobby" : [ "sing", "run", "basketball" ],
"name" : "wangqinghe",
"sex" : "man"
}
读取文件相关的代码如下:
void readfilejson()
{
json::reader reader;
json::value root;
ifstream in("demo.json", ios::binary);
if (!in.is_open())
{
cout << "error opening file\n";
return ;
}
if (reader.parse(in, root))
{
string name = root["name"].asstring();
string age = root["age"].asstring();
string sex = root["sex"].asstring();
cout << "name:" << name << endl;
cout << "age:" << age << endl;
cout << "sex:" << sex << endl;
string friend_name = root["bro"]["friend_name"].asstring();
string friend_age = root["bro"]["friend_age"].asstring();
string friend_sex = root["bro"]["friend_sex"].asstring();
cout << "friend_name:" << friend_name << endl;
cout << "friend_age:" << friend_age << endl;
cout << "friend_sex:" << friend_sex << endl;
for (unsigned int i = 0; i < root["hobby"].size(); i )
{
string str = root["hobby"][i].asstring();
cout << str << "\t";
}
}
else
{
cout << "parse error\n" << endl;
}
in.close();
}
写入json文件
写入的文件就是上面的demo.json文件,代码如下:
void writefilejson()
{
//根节点
json::value root;
root["name"] = json::value("wangqinghe");
root["age"] = json::value("22");
root["sex"] = json::value("man");
//子节点
json::value bro;
bro["friend_name"] = json::value("wangwenjian");
bro["friend_age"] = json::value("25");
bro["friend_sex"] = json::value("man");
root["bro"] = json::value(bro);
//数组形式
root["hobby"].append("sing");
root["hobby"].append("run");
root["hobby"].append("basketball");
cout << "styledwriter:" << endl;
json::styledwriter sw;
cout << sw.write(root) << endl << endl;
ofstream os;
os.open("demo.json", std::ios::out);
if (!os.is_open())
{
cout << "error:can't find the file" << endl;
}
os << sw.write(root);
os.close();
}