c++json库jsoncpp新api CharReaderBuilder 使用方法

c++json库jsoncpp使用方法

最近做项目的时候用到json处理数据,查了一下发现jsoncpp使用比较方便,但网上的教程基本都是老版本的api教程,编译器编译的时候会报错,于是研究了一下新版本api的使用方法,记录一下,以后万一忘了还能翻着看看。

github下载地址

https://github.com/open-source-parsers/jsoncpp


## 使用源文件

在github上下载好以后,在命令行下进入该项目所在的地址,直接执行python amalgamate.py命令,会在dist目录下生成两个头文件和一个源文件json-forwards.h 、json.h和jsoncpp.cpp。因为jsoncpp源码就四五千行,直接放在jsconcpp.cpp中和工程中其他代码一起编译也比较方便。

执行完命令之后的效果,把他们分别放进源文件和头文件的目录里就可以

随便写一个json数据

{
  "Name": "Liming",
  "Age": 26,
  "Language": ["C++", "Java"],
  "E-mail": {
    "Netease": "lmshao@163.com",
    "Hotmail": "liming.shao@hotmail.com"
  }
}


stringWrite(生成json字符串)

std::string createJson()
{
	std::string jsonStr;
	Json::Value root, lang, mail;
	Json::StreamWriterBuilder writerBuilder;
	std::ostringstream os;

	root["Name"] = "Liming";
	root["Age"] = 26;

	lang[0] = "C++";
	lang[1] = "Java";
	root["Language"] = lang;

	mail["Netease"] = "lmshao@163.com";
	mail["Hotmail"] = "liming.shao@hotmail.com";
	root["E-mail"] = mail;

	std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
	jsonWriter->write(root, &os);
	jsonStr = os.str();

	std::cout << jsonStr << std::endl;
	return jsonStr;
}


streamWrite(生成json文件)

std::string createJson()
{
	std::string jsonStr;
	Json::Value root, lang, mail;
	Json::StreamWriterBuilder writerBuilder;
	std::ostringstream os;

	root["Name"] = "Liming";
	root["Age"] = 26;

	lang[0] = "C++";
	lang[1] = "Java";
	root["Language"] = lang;

	mail["Netease"] = "lmshao@163.com";
	mail["Hotmail"] = "liming.shao@hotmail.com";
	root["E-mail"] = mail;

	std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
	jsonWriter->write(root, &os);
	jsonStr = os.str();

	ofstream outfile("C:\\Users\\Administrator\\Desktop\\out.json");
	outfile << jsonStr;
	outfile.close();
}

readFromString(从json字符串中读取数据)

bool parseJson(const std::string &info)
{
	if (info.empty()) {
		std::cout << "info.empty!" << std::endl;
		return false;
	}

	bool res;
	JSONCPP_STRING errs;
	Json::Value root, lang, mail;
	Json::CharReaderBuilder readerBuilder;

	std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());

	res = jsonReader->parse(info.c_str(), info.c_str() + info.length(), &root, &errs);
	if (res == 0)std::cout << "RES = 0" << std::endl;
	if (!res || !errs.empty()) {
		std::cout << "parseJson err. " << errs << std::endl;
	}

	std::cout << "Name: " << root["Name"].asString() << std::endl;
	std::cout << "Age: " << root["Age"].asInt() << std::endl;

	lang = root["Language"];
	std::cout << "Language: ";
	for (int i = 0; i < lang.size(); ++i) {
		std::cout << lang[i] << " ";
	}
	std::cout << std::endl;

	mail = root["E-mail"];
	std::cout << "Netease: " << mail["Netease"].asString() << std::endl;
	std::cout << "Hotmail: " << mail["Hotmail"].asString() << std::endl;

	return true;
}

int main(int argc, char *argv[])
{
	string x=createJson();
	parseJson(x);
	return 0;
}

得到结果
在这里插入图片描述

readFromString(从json文件中读取数据)

bool parseJson()
{
	Json::Value root, lang, mail;
	std::ifstream ifs;
	ifs.open("out.json");

	Json::CharReaderBuilder builder;
	builder["collectComments"] = true;
	JSONCPP_STRING errs;
	if (!parseFromStream(builder, ifs, &root, &errs)) {
		std::cout << errs << std::endl;
		return false;
	}
	
	std::cout << "Name: " << root["Name"].asString() << std::endl;
	std::cout << "Age: " << root["Age"].asInt() << std::endl;

	lang = root["Language"];
	std::cout << "Language: ";
	for (int i = 0; i < lang.size(); ++i) {
		std::cout << lang[i] << " ";
	}
	std::cout << std::endl;

	mail = root["E-mail"];
	std::cout << "Netease: " << mail["Netease"].asString() << std::endl;
	std::cout << "Hotmail: " << mail["Hotmail"].asString() << std::endl;
	return true;
}

int main(int argc, char *argv[])
{
	string x=createJson();
	parseJson();
	return 0;
}

得到同样的结果
在这里插入图片描述

总结

可以把Json::Value理解为一个Json结构,这个类型可以嵌套,也可以当做数组一样使用,在需要的时候可以把这个结构转为相应的类型。
比如:
我们已经知道root[“Name”]存放的是一个string,可以把使用.asString()转换为string类型;
知道root[“Language”]这个Json::Value是一个数组,就可以像数组一样使用下标进行取值;
知道root[“E-mail”]这个Json::Value里面是嵌套的一个json,就可以和root结构一样进行处理。


参考资料

https://blog.csdn.net/shaosunrise/article/details/84680602
https://github.com/open-source-parsers/jsoncpp/tree/master/example

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++使用JsonCpp来读取JSON文件,你可以按照以下步骤进行操作: 1. 首先,确保已经下载并安装了JsonCpp,并将其包含在你的项目中。 2. 创建一个Json::Value对象来存储解析后的JSON数据。 3. 使用Json::Reader对象来读取JSON文件并解析为Json::Value对象。 下面是一个简单的示例代码,演示了如何使用JsonCpp读取JSON文件: ```cpp #include <iostream> #include <fstream> #include <json/json.h> int main() { // 读取 JSON 文件 std::ifstream jsonFile("example.json"); if (!jsonFile.is_open()) { std::cout << "Failed to open JSON file." << std::endl; return 1; } // 解析 JSON 数据 Json::Value root; Json::Reader reader; if (!reader.parse(jsonFile, root)) { std::cout << "Failed to parse JSON data." << std::endl; return 1; } // 读取 JSON 数据并输出 std::string name = root["name"].asString(); int age = root["age"].asInt(); std::string city = root["city"].asString(); std::cout << "Name: " << name << std::endl; std::cout << "Age: " << age << std::endl; std::cout << "City: " << city << std::endl; return 0; } ``` 在上面的示例中,我们首先打开了一个名为`example.json`的JSON文件,然后使用JsonCppJson::Reader对象解析JSON数据,并将其存储在名为`root`的Json::Value对象中。接下来,我们通过访问`root`对象的键值对来获取JSON数据,并将其输出到控制台上。 请确保将示例代码中的`example.json`替换为你实际使用JSON文件的路径。 这里提供一个CSDN上的相关教程供参考:[https://blog.csdn.net/qq_41453285/article/details/105808014](https://blog.csdn.net/qq_41453285/article/details/105808014)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值