C++使用jsoncpp读取json文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LL596214569/article/details/85221694

我用的是VS2015,相关代码与资源https://download.csdn.net/download/ll596214569/10870532

首先,建立一个文件夹用来存放整个工程以及jsoncpp的代码和json文件

其中jsoncpp-src-0.5.0 是我下好的jsoncpp的源码,jsonpractice是我建来测试的工程,bookinfo.json是我写的用来测试的json文件,displayIniTree.rar没有用可以忽略。

有了这些接下来要做的第一步是创建jsoncpp的lib,打开 G:\算法代码C++\jsoncpp\jsoncpp-src-0.5.0\makefiles\vs71 中的jsoncpp.sln,然后修改根据自己的需要直接生成就可以,

其中红色圆圈是你需要的属性,debug还是release,64位还是32位,总会有写粗心大意的人忘了修改这里,然后生成之后发现不能用(比如我)。。。。。设置好之后直接生成就行;

这样就是生成了,然后就去对应的路径下找到刚才生成的lib库。

然后在我们建立的工程中,添加两个文件夹一个叫include,一个叫lib

然后把 G:\算法代码C++\jsoncpp\jsoncpp-src-0.5.0\include 中的json文件夹拷到刚建的include中,把刚才生成的lib文件拷到lib中。

接下来,打开我们建立的测试工程,打开项目属性:

将项目中的include文件夹路径写入C++  →  常规  →  附加包含目录  中

然后将lib文件夹路径写入链接器 →  常规  →  附加库目录  中

再将lib文件夹下的jsonlib文件名写入链接器 →  输入  →  附加依赖项  中,

然后打开C/C++  代码生成  运行库,检查项目的运行库属性是否与我们生成的lib一致,修改为一致

最后在项目的stdafx.h中,添加一行

#pragma comment(lib, "json_vc71_libmtd.lib")

其中json_vc71_libmtd.lib是我们生成的jsoncpp的lib名

至此,环境配置就结束了,接下来就可以下代码了。

我的json文件里面的结构是

所以我在代码中建立了三个结构体,分别用来保存“每一章的信息”、“每本书的信息”、“每个书籍系列的信息”

struct CHAPTERINFO	// 每章信息
{
	string chapterName;
	int page;
	string author;
};
struct BOOKINFO	// 每本书信息
{
	string bookName;
	int bookPrice;
	vector<CHAPTERINFO> chaVec;
};
struct BOOKSERIES	// 每个系列书籍
{
	string fileName;
	vector<BOOKINFO> bookVec;
};

然后在程序中:

// jsonpractice.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "include\json\json.h"
#include <iostream>
#include <fstream>
using namespace std;

struct CHAPTERINFO	// 每章信息
{
	string chapterName;
	int page;
	string author;
};
struct BOOKINFO	// 每本书信息
{
	string bookName;
	int bookPrice;
	vector<CHAPTERINFO> chaVec;
};
struct BOOKSERIES	// 每个系列书籍
{
	string fileName;
	vector<BOOKINFO> bookVec;
};


int main()
{
	ifstream ifs;
	ifs.open("bookinfo.json");
	Json::Value value;
	Json::Reader jsonReader;
	vector<BOOKSERIES> BookVec;//存储所有系列书籍的信息
	if (jsonReader.parse(ifs, value))
	{
		//读取父级节点信息
		for (unsigned int i = 0; i < value["bookbox"].size(); i++)
		{
			BOOKSERIES CSSeries;// 计算机系列
			BOOKINFO	CSBook; // 计算机系列中的一本书
			string seriesName = value["name"].asString();// 当前系列的名字
			CSSeries.fileName = seriesName;

			for (unsigned int j = 0; j < value["bookbox"][i]["factorbox"].size(); j++)
			{
				string bookName = value["bookbox"][i]["factorbox"][j]["name"].asString();// 书籍名
				CSBook.bookName = bookName;
				int bookPrice = value["bookbox"][i]["factorbox"][j]["price"].asInt();// 书籍价格
				CSBook.bookPrice = bookPrice;
				CSBook.chaVec.clear();// 清空上一次的章节信息
				//遍历每本书的所有章节
				for (unsigned int m = 0; m < value["bookbox"][i]["factorbox"][j]["child"].size(); m++)
				{
					CHAPTERINFO chapter;
					chapter.chapterName = value["bookbox"][i]["factorbox"][j]["child"][m]["chapter"].asCString();
					chapter.page = value["bookbox"][i]["factorbox"][j]["child"][m]["page"].asInt();
					if (!value["bookbox"][i]["factorbox"][j]["child"][m]["author"].isNull())
					{
						chapter.author = value["bookbox"][i]["factorbox"][j]["child"][m]["author"].asString();
					}
					CSBook.chaVec.push_back(chapter);
				}
				CSSeries.bookVec.push_back(CSBook);
			}
			BookVec.push_back(CSSeries);
		}
	}
	
	//	输出读到的书籍信息
	for (vector<BOOKSERIES>::iterator iter = BookVec.begin();
		iter != BookVec.end();
		++iter)
	{
		BOOKSERIES CSSeries;// 计算机系列
		CSSeries = *iter;
		cout << "书籍系列:" <<CSSeries.fileName << endl;
		for (vector<BOOKINFO>::iterator iter2 = CSSeries.bookVec.begin();
			iter2 != CSSeries.bookVec.end();
			++iter2)
		{
			BOOKINFO CSBook = *iter2;
			cout << "书籍名称:" << CSBook.bookName << endl;
			cout << "书籍价格:" << CSBook.bookPrice << endl;
			for (vector<CHAPTERINFO>::iterator iter3 = CSBook.chaVec.begin();
				iter3 != CSBook.chaVec.end();
				++iter3)
			{
				CHAPTERINFO chaInfo = *iter3;
				cout << "章节名称:" << chaInfo.chapterName << endl;
				cout << "章节页数:" << chaInfo.page << endl;
				cout << "章节作者:" << chaInfo.author << endl;
			}
		}
	}
	system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/LL596214569/article/details/85221694