C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解_c++ json-程序员宅基地

技术标签: C/C++  读json  存储数据方式  json  jsoncpp  写json  

目录

前言

一、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数据:

{
    "name" : "shuiyixin",
    "age" : "21",
    "sex" : "man"
}

读取代码如下:

void readStrJson()
{
	//字符串  
	const char* 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["nomen"].asInt();
		string sex = root["sex"].asString();
		cout << name + "," << age << "," << sex <<  endl;
	}

}

2.复杂json样式

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

{
    "name":"shuiyixin",
    "major":[
    {
        "AI":"MachineLearning"
    },
    {
        "AI":"DeepLearning"
    },
    {
        "AI":"ComputerVision"
    }]
}

读取代码如下:

void readStrProJson()
{
	string strValue = "{\"name\":\"shuiyixin\",\"major\":[{\"AI\":\"MachineLearning\"},{\"AI\":\"DeepLearning\"},{\"AI\":\"ComputerVision\"}]}";
	Json::Reader reader;
	Json::Value value;
	if (reader.parse(strValue, value))
	{
		string out = value["name"].asString();
		cout << out << endl;
		const Json::Value arrayObj = value["major"];
		for (unsigned int i = 0; i < arrayObj.size(); i++)
		{
			out = arrayObj[i]["AI"].asString();
			cout << out<<endl;
		}
	}
}

 

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

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

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

以下面这个json文件为例:

{
   "age" : 21,
   "friends" : {
      "friend_age" : 21,
      "friend_name" : "ZhaoWuxian",
      "friend_sex" : "man"
   },
   "hobby" : [ "sing", "run", "Tai Chi" ],
   "name" : "shuiyixin",
   "sex" : "man"
}

读取代码如下:

void readFileJson()
{
	Json::Reader reader;
	Json::Value root;

	//从文件中读取,保证当前文件有demo.json文件  
	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();
		int age = root["age"].asInt();
		string sex = root["sex"].asString();

		cout << "My name is " << name << endl;
		cout << "I'm " << age << " years old" << endl;
		cout << "I'm a " << sex << endl;

		//读取子节点信息  
		string friend_name = root["friends"]["friend_name"].asString();
		int friend_age = root["friends"]["friend_age"].asInt();
		string friend_sex = root["friends"]["friend_sex"].asString();

		cout << "My friend's name is " << friend_name << endl;
		cout << "My friend's sex is "<<friend_sex << endl;
		cout << "My friend is " << friend_age << " years old" << endl;

		//读取数组信息  
		cout << "Here's my hobby:" << endl;
		for (unsigned int i = 0; i < root["hobby"].size(); i++)
		{
			string ach = root["hobby"][i].asString();
			cout << ach << '\t';
		}
		cout << endl;

		cout << "Reading Complete!" << endl;
	}
	else
	{
		cout << "parse error\n" << endl;
	}

	in.close();
}

4、C++写入json文件

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

{
   "age" : 21,
   "friends" : {
      "friend_age" : 21,
      "friend_name" : "ZhaoWuxian",
      "friend_sex" : "man"
   },
   "hobby" : [ "sing", "run", "Tai Chi" ],
   "name" : "shuiyixin",
   "sex" : "man"
}

写入代码如下:

void writeFileJson()
{
	//根节点  
	Json::Value root;

	//根节点属性  
	root["name"] = Json::Value("shuiyixin");
	root["age"] = Json::Value(21);
	root["sex"] = Json::Value("man");

	//子节点  
	Json::Value friends;

	//子节点属性  
	friends["friend_name"] = Json::Value("ZhaoWuxian");
	friends["friend_age"] = Json::Value(21);
	friends["friend_sex"] = Json::Value("man");

	//子节点挂到根节点上  
	root["friends"] = Json::Value(friends);

	//数组形式  
	root["hobby"].append("sing");
	root["hobby"].append("run");
	root["hobby"].append("Tai Chi");

	//直接输出  
	//cout << "FastWriter:" << endl;
	//Json::FastWriter fw;
	//cout << fw.write(root) << endl << endl;

	//缩进输出  
	cout << "StyledWriter:" << endl;
	Json::StyledWriter sw;
	cout << sw.write(root) << endl << endl;

	//输出到文件  
	ofstream os;
	os.open("demo.json", std::ios::out | std::ios::app);
	if (!os.is_open())
		cout << "error:can not find or create the file which named \" demo.json\"." << endl;
	os << sw.write(root);
	os.close();

}

要注意的是:

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

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

5、主函数

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

#include <string>  
#include <json.h>
#include <iostream>  
#include <fstream>  
using namespace std;

void readStrJson(); //从字符串中读取JSON  
void readStrProJson(); //从字符串中读取JSON(内容复杂些)  
void readFileJson(); //从文件中读取JSON 
void writeFileJson();  //将信息保存为JSON格式  

int main(int argc, char *argv[])
{
	writeFileJson(); //写入json

	readFileJson(); //从文件中读取JSON 

	cout << "\n\n";

	readStrJson();  //从字符串中读json

	cout << "\n\n";

	readStrProJson();//从字符串中读取JSON(内容复杂些)  
	
	system("pause");
	return 0;
}

 附: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文件,并复制

 

添加到源文件中

然后就可以使用啦。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shuiyixin/article/details/89330529

智能推荐

3.3 ORACLE 的 EMP&DEPT表 建表语句_oracle emp建表语句-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏15次。ORACLE 的 EMP&DEPT表 建表语句-- 创建表与数据CREATE TABLE EMP(EMPNO NUMBER(4) NOT NULL,ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE,SAL NUMBER(7, 2),COMM NUMBER(7, 2),DEPTNO NUMBER(..._oracle emp建表语句

使django支持PUT,DELETE的方案_django如何简单快速实现put、delete方法-程序员宅基地

文章浏览阅读9.5k次。第一种方案修改ajax中type方式并设置header,同时对put重新构建数据字典在对views中的方法进行类对象封装时,发现django并不支持像post和get一样将数据封装。 由于网页端无法设置method方法,在用postman和ajax开启pycharm对接口进行debug测试时发现:提交数据后并没有进入代码逻辑。 查阅资料得知,django支持put和delete方法..._django如何简单快速实现put、delete方法

vscode通过跳板机(堡垒机)连接remote服务器_vscode 连接堡垒机-程序员宅基地

文章浏览阅读2.9w次,点赞17次,收藏45次。先吐槽: 搞了一上午!!! 我太难了!!! 最近服务器不够用, 就差动手算深度学习梯度了!!! 向本科朋友借了几台机子跑, 这要是没上过大学, 研究生还不能毕业了呢!!!目录1. 简单任务介绍2. 本机的配置3. 跳板机的配置4.内网服务器的配置5. 怎么样不需要密码访问嘤嘤嘤~~1. 简单的任务介绍:我现在用的电脑叫做A, 然后借了一台服务器叫做C..._vscode 连接堡垒机

【实战】python-docx---每页表格固定显示行数_python docx设置每页行数-程序员宅基地

文章浏览阅读1.1k次。例如100行数据填入word,每页固定展示5行,需要20页_python docx设置每页行数

OpenEmu:一个让你在Mac上爽快体验任天堂的模拟器_openemu苹果电脑-程序员宅基地

文章浏览阅读7k次。目录前言OpenEmu简介OpenEmu实际体验最后前言 这次的文章和以往不太一样, 不谈技术, 来谈谈情怀. 记得那是我小学二三年级的时候吧, 我妈给我买了一个Game Boy, 价格记不清了, 反正不贵, 而且是黑白的那种, 应该就是初代Game Boy吧. 然后还配了一张口袋妖怪青的卡. 在那个魔域啊, 传奇啊, 或者什么类似网游盛..._openemu苹果电脑

java socket与io流_Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)-程序员宅基地

文章浏览阅读108次。声明:该博文以socket中,关闭输出流为例进行说明。为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做为Socket输出流的代言。同样的,din是输入流的代言。可以造成dout被关闭的操作有:1、调用dout.clo..._error:java.net.socketexception: socket output is shutdown

随便推点

yii2 在线教育系统,开办托管班需要什么手续?如何经营托管班?-程序员宅基地

文章浏览阅读330次,点赞8次,收藏6次。托管班店铺的装修风格,一定要结合学生喜欢的设计风格,颜色搭配一定要看起来舒适,让学生一进来就有学习的范围,不由自主就想学习的动力,所以装修的风格,是要符合学生学习的环境氛围,让学生一进来想呆着不想走,所以设计方面,一定一定多参考同行的装修风格。想要运营好一家托管班,那么需要有一个正规化的管理流程,那么就要为校区制定各种规章制度,按照规章制度来走,避免后期因为没有任何提示,导致出现一系列的问题,所以要出针对教师,学生,家长的不同规章制度。保护孩子的安全,预防托管机构火灾事故的发生,是托管班一项重要指标。

外观模式实例-智能手机一键备份_某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以-程序员宅基地

文章浏览阅读2.2k次,点赞7次,收藏40次。外观模式实例问题描述结构图编程实现需要交互的类Facade类客户端问题描述某软件公司为新开发的智能手机控制与管理软件提供一键备份功能,通过该功能可以将原本存储在手机中的通讯录、短信、照片、音乐等资料一次性拷贝到移动存储介质中(例如:SD卡)中。在实现过程中需要与多个已有的类进行交互,如通讯录管理类、短信管理类。结构图编程实现需要交互的类public class ContactsManager { private String contacts; public Contacts_某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以

走出MFC子类化的迷宫_vs怎么用mfc画出迷宫-程序员宅基地

文章浏览阅读1k次。本文转自:http://www.99inf.net/SoftwareDev/VC/22322.htmWindows给我们或是说给它自己定义了许多丰富的通用控件,如:Edit、ComboBox 、ListBox……等,这些控件功能丰富,能为我们开发工作带来极大方面,试想:我们单单是自己实现一个EDIT控件是多么的艰难!但是,在实际开发中还是有些情况这些标准控件也无能为力,比如:在我们的应用中要求_vs怎么用mfc画出迷宫

【矩阵学习】Jacobian矩阵和Hessian矩阵_海森矩阵判断是否为驻点-程序员宅基地

文章浏览阅读6.4k次,点赞5次,收藏42次。【矩阵学习】Jacobian矩阵和Hessian矩阵Jacobian 矩阵Jacobian 行列式功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchar..._海森矩阵判断是否为驻点

回顾HTTP协议和报文_协议报文和数据报文的区别-程序员宅基地

文章浏览阅读487次。计算机网络这门课是在大二上的时候是作为主修课,当然上这门课的时候有点划水了。后来接触到校招这方面,下定决心恶补计算机网络这方面的知识,就买了一本《计算机网络:自顶向下的方法》研习。如果不想读谢希仁那版书(毕竟晦涩难懂),又想比较系统的了解计算机网络这方面知识,这本书真的非常推荐。划重点:简单回顾一下HTTP及其报文。1、什么是HTTP协议?HTTP 超文本传输协议 (HTTP-Hypertext transfer protocol),是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用_协议报文和数据报文的区别

Flash / Flex Tutorial - How to Create a crossdomain.xml file-程序员宅基地

文章浏览阅读535次。Flash / Flex Tutorial - How to Create a crossdomain.xml file.This brief tutorial will teach you how to create a crossdomain.xml file so that you can access files and information from outside domains

推荐文章

热门文章

相关标签