C++ 操作 (读写)json 文件及jsoncpp的配置

一、json文件简介


为什么要用json文件呢?

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

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

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

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

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

JSON 比更小、更快,更易解析。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语法:

  • 数据在 名称/值 对中
  • 数据由逗号 , 分隔
  • 使用斜杆来转义 \ 字符
  • 大括号 {} 保存对象

三、jsoncpp配置


解析JSON文件我们需要网上开源的库,在这里我用的是jsoncpp库。jsoncpp库的配置相比于tinyXML2稍难,不过按照步骤来就好。

1、首先下载jsoncpp,可以点击jsoncpp下载。
2、下载好之后,解压到本地文件,我们解析JSON文件一般只需要文件中的include文件和src文件。

3、创建解析JSON文件的工程,然后把这两个文件复制到工程目录中

4、配置项目的依赖库
右击项目 -》属性 -》C\C++ -》常规 -》附加包含目录,添加依赖,就是刚才你放的include文件目录地址,每个人都不一样,如图所示:

 这一步就是引用库文件,引用出差错一般会#include标红,注意头文件引用的绝对路径就行。
5. 把src文件中lib_json下的.cpp文件导入目录,如图所示:

四、C++操作json文件

读取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文件

{
  "A": {
    "type": "SINT",
    "value": 0
  },
  "age": "18",
  "B": {
    "type": "INT",
    "value": 0
  },
  "C": {
    "type": "DATE",
    "value": {
      "year": [ "2019", "2013", "2012" ],
      "month": [ "1", "2", "3" ]

    }
  },
  "friend": {
    "friend_age": "18",
    "friend_name": "qiwen",
    "friend_sex": "man"
  },
  "hobby": [ "bamintan", "eat", "rap" ],
  "name": "hemenglin",
  "sex": "male"

}

读取文件相关的代码如下: 

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["friend"]["friend_name"].asString();
		string friend_age = root["friend"]["friend_age"].asString();
		string friend_sex = root["friend"]["friend_sex"].asString();

		string atype = root["A"]["type"].asString();
		string avalue = root["A"]["value"].asString();

		string btype = root["B"]["type"].asString();
		string bvalue = root["B"]["value"].asString();

		cout << "atype:" << atype << endl;
		cout << "avalue:" << avalue << endl;

		cout << "btype:" << btype << endl;
		cout << "bvalue:" << bvalue << endl;

		cout << "friend_name:" << friend_name << endl;
		cout << "friend_age:" << friend_age << endl;
		cout << "friend_sex:" << friend_sex << endl;

		cout << "hobby:"  << endl;
		for (unsigned int i = 0; i < root["hobby"].size(); i++)
		{
			string str = root["hobby"][i].asString();
			cout << str << "\t";
		}
		
		string Ctype = root["C"]["type"].asString();
		cout << "Ctype:" << Ctype << endl;
		//string Cvalue = root["C"]["value"]["year"].asString();
		//cout << "Cvalue:" << Cvalue << endl;

		cout << "DATE OF YEAR:" << endl;
		for (unsigned int i = 0; i < root["C"]["value"]["year"].size(); i++)
		{
			string str = root["C"]["value"]["year"][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("hemenglin");
	root["age"] = Json::Value("18");
	root["sex"] = Json::Value("male");

	//子节点
	Json::Value bro;
	bro["friend_name"] = Json::Value("qiwen");
	bro["friend_age"] = Json::Value("18");
	bro["friend_sex"] = Json::Value("man");

	root["friend"] = Json::Value(bro);


	//ctest 
	Json::Value Ctest;
	Ctest["type"] = Json::Value("DATE");
	Ctest["value"] = Json::Value();
	root["C"] = Json::Value(Ctest);

	Json::Value Ctest2;
	Ctest2["year"] = Json::Value();
	Ctest2["month"] = Json::Value();
	Ctest2["day"] = Json::Value();
	root["C"]["value"] = Json::Value(Ctest2);

	
	
	root["C"]["value"]["year"].append("2019");
	root["C"]["value"]["year"].append("2013");
	root["C"]["value"]["year"].append("2012");

	root["C"]["value"]["month"].append("3");
	root["C"]["value"]["month"].append("2");
	root["C"]["value"]["month"].append("1");
	//ctest 

	//数组形式
	root["hobby"].append("bamintan");
	root["hobby"].append("eat");
	root["hobby"].append("rap");


	cout << "\nStyledWriter:" << 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();

}

写的效果如图:  

要注意的是:

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

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

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 要解析JSON文件,首先需要安装jsoncpp库,可以通过以下命令安装: ``` sudo apt-get install libjsoncpp-dev ``` 安装完毕后,就可以使用jsoncpp库来解析JSON文件了。下面是一个简单的示例程序: ```cpp #include <iostream> #include <fstream> #include <jsoncpp/json/json.h> using namespace std; int main() { ifstream ifs("example.json"); Json::Reader reader; Json::Value root; if (!reader.parse(ifs, root)) { cout << "Failed to parse JSON" << endl; return 1; } string name = root["name"].asString(); int age = root["age"].asInt(); cout << "Name: " << name << endl; cout << "Age: " << age << endl; return 0; } ``` 在这个示例程序中,首先通过ifstream读取example.json文件,然后使用Json::Reader来解析JSON文件,解析结果存放在Json::Value对象root中。可以通过root对象来访问JSON中的数据。 在这个示例程序中,我们访问了JSON中的"name"和"age"字段,并将它们打印出来。 需要注意的是,以上示例程序中的JSON文件格式如下: ```json { "name": "John", "age": 30 } ``` 如果JSON文件的格式不正确,解析过程中可能会出现错误。因此,在实际应用中,需要根据实际情况进行错误处理。 ### 回答2: JSONCpp是一个C++的库,用于解析和生成JSON格式的数据。它提供了一组简单的API来读取和修改JSON数据。 使用JSONCpp解析JSON文件的过程包括以下几个步骤: 1. 引入JSONCpp库:在编程环境中,需要将JSONCpp文件引入到项目中。可以从JSONCpp的官方网站上下载并配置文件。 2. 打开JSON文件:使用JSONCpp库中的`Json::CharReader`来打开JSON文件,将其读取为一个字符串。 3. 解析JSON文件:使用JSONCpp库中的`Json::Value`来解析JSON字符串。可以使用`Json::Reader`的`parse()`方法来将JSON字符串转换为`Json::Value`对象。 4. 提取JSON数据:使用`Json::Value`对象的成员访问运算符`[]`来获取JSON数据。可以使用`isMember()`方法判断指定的成员是否存在,使用`asString()`、`asInt()`等方法获取指定成员的值。 5. 遍历JSON数据:如果JSON数据是一个数组类型,可以使用`size()`方法获取数组的长度,使用`operator[]`来访问数组中的元素。 6. 修改JSON数据:使用`Json::Value`对象的成员访问运算符`[]`来修改JSON数据。可以使用`append()`方法向数组类型的JSON数据中添加元素。 7. 保存JSON文件:使用JSONCpp库中的`Json::StyledWriter`对象将`Json::Value`对象转换为字符串,并将其写入文件中。 总结起来,使用JSONCpp解析JSON文件的过程可以归纳为:引入库文件、打开JSON文件、解析JSON文件、提取和操作JSON数据、保存JSON文件。这样就可以实现对JSON文件的读取和解析操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ze言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值