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

c++读取json文件_cfile读写文件说明:本篇文章主要参考了如下博主的内容,地址附上:一、JSON文件简介1、什么是JSON文件? JSON文件是一种文本文件,一种配置文件,它具有严格的编写规则,这样可以是使用者更好的阅读和使用该类型文件。它的编写规则如下:JSON文件使用花括号括起来,代表一段数据,这段数据里面可以有多个字段。每个字段的结构有点类似于Map容器,一个key对应一个value。字段名必须用双引号包围,而字段的值可以是多种类型,例如浮点型、整形、字符串类型,甚至可以是一个新的数据段,就数据的嵌套。2、JSON文

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

说明:本篇文章主要参考了如下博主的内容,地址附上:(https://blog.csdn.net/shuiyixin/article/details/89330529)

一、JSON文件简介

1、什么是JSON文件?

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

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

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

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

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

1、简单样式的JSON

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

	复杂样式的JSON文件有好几个数据段,如下所示:
{ 
   
	"name" : "weier",
	"age" : 21,
	"sex" : "man",
	"friend" : [{ 
   
		"name" : "lilei"
		},{ 
   
		"name" : "xiaoming"
		}]
}
源码如下:
#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"];
		}

	}
}
运行结果如下:

在这里插入图片描述

三、从JSON文件中读取数据

	从上述两个例子中可以大致的第JSON数据的读取有了初步的了解,但是在实际的应用中主要是读取JSON配置
文件。下例将演示如何读取JSON文件:

1、src.json配置文件:

在这里插入图片描述

2、源程序:
#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();
}
3、运行结果:

在这里插入图片描述
四、C++写JSON文件

	在读JSON文件的基础之上,我们将读取到的结果写入一个新的JSON文件中,而不是直接输出到终端。

1、写JSON文件的源代码如下:
#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();
}
2、运行结果如下:
(1)终端输出:

在这里插入图片描述

(2)生成的des.json文件:

在这里插入图片描述

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 背包问题九讲[转载][通俗易懂]

    背包问题九讲[转载][通俗易懂]背包问题九讲P01:01背包问题题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转

    2022年7月12日
    27
  • window git安装步骤_Ubuntu git安装

    window git安装步骤_Ubuntu git安装Windows下安装git超详细图文教程

    2022年9月8日
    0
  • java编程代码都是背下来的吗_向学弟学妹们介绍自己的大学

    java编程代码都是背下来的吗_向学弟学妹们介绍自己的大学同学们好,今天二哥是来还债的,记得先拖到文末点个赞再回来细细的读,好不好!最近一段时间,我一直在学习Java虚拟机和字节码方面的知识,为的就是有朝一日成为真正牛逼的技术大佬!不知道大家有没有这种感觉,就是一开始学习编程的时候,真心不想看底层的东西,就想直接上来撸代码,但时间久了以后,总感觉缺点啥~~~~于是我开始阅读《深入理解计算机系统》、《图解TCP/IP》、《深入理解Java虚拟机》这些偏底层的书籍,看得烦了,就去刷我之前给大家推荐过的两个视频课,《哈佛大学的CS50》和《计算机科学速成

    2022年10月30日
    0
  • 微信小程序:微信登陆(ThinkPHP作后台)

    微信小程序:微信登陆(ThinkPHP作后台)

    2021年10月14日
    48
  • 小程序常用的生命周期_小程序组件的生命周期

    小程序常用的生命周期_小程序组件的生命周期小程序的生命周期说白了就是指程序从创建、到开始、暂停、唤起、停止、卸载的过程。我们大概从三个角度看一下小程序的生命周期。(1):应用生命周期(2):页面生命周期(3):应用生命周期影响页面生命周期一:应用生命周期放一张从网上找的图:1:用户首次打开小程序,触发onLaunch(全局只触发一次)。:2:小程序初始化完成后,触发onShow方法,监听小程序显示。3:小程序从前台进入后台,触发onHide方法。:4:小程序从后台进入前台显示,触发onShow方法。5:小程序后台运行一

    2022年10月25日
    0
  • sql格式化工具-SQL Pretty Printer

    sql格式化工具-SQL Pretty Printersql格式化工具-SQLPrettyPrinter导言使用主要功能:其他功能:RenameTable和RenameColumnToC#(ToVB.NET)C#ToSQL(VB.NETToSQL)SQLFormatterOptions导言写SQL语句或者脚本时,很容易出现凌乱的情况,这里推荐一款很方便的SQLServer插件:SQLPrettyPrinter…

    2022年10月22日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号