C++使用jsoncpp读取json文件
我用的是VS2015,相关代码与资源
下载里的这份代码我设置的好像是2个积分,但是CSDN自己涨价了,现在要好几十个积分,不建议下载,请各位先阅读文章之后再决定是否需要下载这部分资源;
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;
}
更多推荐
所有评论(0)