小言_互联网的博客

C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解

624人阅读  评论(0)

目录

前言

一、json文件简介

1、json文件

2、json与其他存储数据方式比较

二、C++操作json文件

1、jsoncpp 库下载

2、C++从字符串中读取json

3、C++从文件中读取json

4、C++写入json文件

5、主函数

 附:jsoncpp库配置

1、解压并转移

2、配置属性

3、配置项目


前言

json文件是比较轻量级的文件,格式简单,使用方便。用来存放信息相比其他方式有自己得天独厚的优势。

今天给大家分享的是如何利用C++来操作json文件。

如果你知道如何使用jsoncpp类库,可以不用看附,如果第一次使用,请先到最后,将环境配置好,再进行操作。

有人说用这篇文章中配置的方法有问题。我想大家应该是有些小细节跟我做的不一样,为此,我为大家配置好一个,大家可以加群:326866692下载使用。

包括jsoncpp库也在群文件中。

 

 

一、json文件简介

1、json文件

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

2、json与其他存储数据方式比较

为什么要用json文件呢?

我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。

相对于txt,word来说,json格式更加明确,获取重要信息非常方便。

相对于xml来说,json格式更加简洁,存储同样的文件,花费的内存更小。

相对于Excel来说,json更适合存储字符类文件。Excel相当于比较简单的数据库了。

相对于数据库来说,json更加方便,数据库我们还需要做一些设置,安装一些软件。json可以直接使用。

二、C++操作json文件

1、jsoncpp 库下载

大家可以自己上网下载jsoncpp 库,也可以加群:326866692下载;

群二维码

2、C++从字符串中读取json

json样式比较多,这里分享两种,一种比较直接简单的,一种稍微有些复杂的。

1.简单json样式

我们定义一个字符串来保存如下json数据:


  
  1. {
  2. "name" : "shuiyixin",
  3. "age" : "21",
  4. "sex" : "man"
  5. }

读取代码如下:


  
  1. void readStrJson()
  2. {
  3. //字符串
  4. const char* str =
  5. "{\"name\":\"shuiyixin\",\"age\":\"21\",\"sex\":\"man\"}";
  6. Json::Reader reader;
  7. Json::Value root;
  8. //从字符串中读取数据
  9. if (reader.parse(str, root))
  10. {
  11. string name = root[ "name"].asString();
  12. int age = root[ "nomen"].asInt();
  13. string sex = root[ "sex"].asString();
  14. cout << name + "," << age << "," << sex << endl;
  15. }
  16. }

2.复杂json样式

所谓复杂,就是说,json里面分好几层,上面那个简单的只有一层,json数据如下:


  
  1. {
  2. "name": "shuiyixin",
  3. "major":[
  4. {
  5. "AI": "MachineLearning"
  6. },
  7. {
  8. "AI": "DeepLearning"
  9. },
  10. {
  11. "AI": "ComputerVision"
  12. }]
  13. }

读取代码如下:


  
  1. void readStrProJson()
  2. {
  3. string strValue = "{\"name\":\"shuiyixin\",\"major\":[{\"AI\":\"MachineLearning\"},{\"AI\":\"DeepLearning\"},{\"AI\":\"ComputerVision\"}]}";
  4. Json::Reader reader;
  5. Json::Value value;
  6. if (reader.parse(strValue, value))
  7. {
  8. string out = value[ "name"].asString();
  9. cout << out << endl;
  10. const Json::Value arrayObj = value[ "major"];
  11. for ( unsigned int i = 0; i < arrayObj.size(); i++)
  12. {
  13. out = arrayObj[i][ "AI"].asString();
  14. cout << out<< endl;
  15. }
  16. }
  17. }

 

3、C++从文件中读取json

从字符串中读取json文件只是为了让大家能够了解json文件,我们最终还是要从文件中读取的。

这个读取的json文件,大家可以通过下面的写json文件自己创建一个。

以下面这个json文件为例:


  
  1. {
  2. "age" : 21,
  3. "friends" : {
  4. "friend_age" : 21,
  5. "friend_name" : "ZhaoWuxian",
  6. "friend_sex" : "man"
  7. },
  8. "hobby" : [ "sing", "run", "Tai Chi" ],
  9. "name" : "shuiyixin",
  10. "sex" : "man"
  11. }

读取代码如下:


  
  1. void readFileJson()
  2. {
  3. Json::Reader reader;
  4. Json::Value root;
  5. //从文件中读取,保证当前文件有demo.json文件
  6. ifstream in("demo.json", ios::binary);
  7. if (!in.is_open())
  8. {
  9. cout << "Error opening file\n";
  10. return;
  11. }
  12. if (reader.parse(in, root))
  13. {
  14. //读取根节点信息
  15. string name = root[ "name"].asString();
  16. int age = root[ "age"].asInt();
  17. string sex = root[ "sex"].asString();
  18. cout << "My name is " << name << endl;
  19. cout << "I'm " << age << " years old" << endl;
  20. cout << "I'm a " << sex << endl;
  21. //读取子节点信息
  22. string friend_name = root[ "friends"][ "friend_name"].asString();
  23. int friend_age = root[ "friends"][ "friend_age"].asInt();
  24. string friend_sex = root[ "friends"][ "friend_sex"].asString();
  25. cout << "My friend's name is " << friend_name << endl;
  26. cout << "My friend's sex is "<<friend_sex << endl;
  27. cout << "My friend is " << friend_age << " years old" << endl;
  28. //读取数组信息
  29. cout << "Here's my hobby:" << endl;
  30. for ( unsigned int i = 0; i < root[ "hobby"].size(); i++)
  31. {
  32. string ach = root[ "hobby"][i].asString();
  33. cout << ach << '\t';
  34. }
  35. cout << endl;
  36. cout << "Reading Complete!" << endl;
  37. }
  38. else
  39. {
  40. cout << "parse error\n" << endl;
  41. }
  42. in.close();
  43. }

4、C++写入json文件

除了读,我们经常还会写入json文件,json文件如下:


  
  1. {
  2. "age" : 21,
  3. "friends" : {
  4. "friend_age" : 21,
  5. "friend_name" : "ZhaoWuxian",
  6. "friend_sex" : "man"
  7. },
  8. "hobby" : [ "sing", "run", "Tai Chi" ],
  9. "name" : "shuiyixin",
  10. "sex" : "man"
  11. }

写入代码如下:


  
  1. void writeFileJson()
  2. {
  3. //根节点
  4. Json::Value root;
  5. //根节点属性
  6. root[ "name"] = Json::Value( "shuiyixin");
  7. root[ "age"] = Json::Value( 21);
  8. root[ "sex"] = Json::Value( "man");
  9. //子节点
  10. Json::Value friends;
  11. //子节点属性
  12. friends[ "friend_name"] = Json::Value( "ZhaoWuxian");
  13. friends[ "friend_age"] = Json::Value( 21);
  14. friends[ "friend_sex"] = Json::Value( "man");
  15. //子节点挂到根节点上
  16. root[ "friends"] = Json::Value(friends);
  17. //数组形式
  18. root[ "hobby"].append( "sing");
  19. root[ "hobby"].append( "run");
  20. root[ "hobby"].append( "Tai Chi");
  21. //直接输出
  22. //cout << "FastWriter:" << endl;
  23. //Json::FastWriter fw;
  24. //cout << fw.write(root) << endl << endl;
  25. //缩进输出
  26. cout << "StyledWriter:" << endl;
  27. Json::StyledWriter sw;
  28. cout << sw.write(root) << endl << endl;
  29. //输出到文件
  30. ofstream os;
  31. os.open( "demo.json", std::ios::out | std::ios::app);
  32. if (!os.is_open())
  33. cout << "error:can not find or create the file which named \" demo.json\"." << endl;
  34. os << sw.write(root);
  35. os.close();
  36. }

要注意的是:

1.如果要写入的文件不存在,会自动创建该文件;

2.如果文件存在,写入过程不会覆盖文件中原有数据,而是将新数据写在原有数据后面。

5、主函数

所有的功能模块都写好啦,剩下就是主函数啦:


  
  1. #include <string>
  2. #include <json.h>
  3. #include <iostream>
  4. #include <fstream>
  5. using namespace std;
  6. void readStrJson(); //从字符串中读取JSON
  7. void readStrProJson(); //从字符串中读取JSON(内容复杂些)
  8. void readFileJson(); //从文件中读取JSON
  9. void writeFileJson(); //将信息保存为JSON格式
  10. int main(int argc, char *argv[])
  11. {
  12. writeFileJson(); //写入json
  13. readFileJson(); //从文件中读取JSON
  14. cout << "\n\n";
  15. readStrJson(); //从字符串中读json
  16. cout << "\n\n";
  17. readStrProJson(); //从字符串中读取JSON(内容复杂些)
  18. system( "pause");
  19. return 0;
  20. }

 附:jsoncpp库配置

jsoncpp库配置与opencv配置原理相同,大家可以看一下下面的教程:

opencv配置(win10+VS2015+OpenCV3.1.0) :https://blog.csdn.net/shuiyixin/article/details/80386022

不过jsoncpp库的内容比较少,配置没有opencv那么麻烦:

1、解压并转移

首先将库解压,将下面的两个文件夹复制到你创建的项目下面

将库解压
将两个文件夹复制到自己创建的项目中

2、配置属性

点击调试,并点击项目属性

点击调试->项目属性
选择VC++目录中的包含目录,点击修改
将includ文件夹下的json文件路径复制到这里,并保存

3、配置项目

将src文件夹下的lib_json文件夹下的cpp文件,添加到源文件中:

找到src文件夹->lib_json文件夹->所有cpp文件,并复制

 

添加到源文件中

然后就可以使用啦。

 


转载:https://blog.csdn.net/shuiyixin/article/details/89330529
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场