nlohmann/json 是一个C++实现的JSON解析器,使用非常方便直观。由于查看文档篇幅过长,不便于迅速阅读抓重点。而且,所举例的某些用法实践上其实比较少用到,而某些实践上常用到的一些用法,官网却缺例子。所以自己简要总结了一下它的主要用法,并加上自己写的示例,希望能给到新接触该库的朋友一些帮助。
下载使用方法
下载地址:
https://github.com/nlohmann/json/tree/develop/single_include/nlohmann/json.hpp
这是一个单独的C++头文件,所有的代码都在这个头文件里,实现代码都是内联实现,因此,只需要在CPP文件里包含这一个头文件即可。
引入头文件
#include "nlohmann/json.hpp"
using json = nlohmann::json;
使用示例:
1、声明与构造
json j1;
json j2 = json::object();
json j3 = json::array();
std::cout << j1.type_name() << std::endl; // output: null
std::cout << j2.type_name() << std::endl; // output: object
std::cout << j3.type_name() << std::endl; // output: array
2、内容构造
json j = R"(
{
"name": "Judd Trump",
"credits": 1754500,
"ranking": 1
}
)"_json;
//或者
json j{
{ "name", "Judd Trump"},
{ "credits", 1754500 },
{ "ranking", 1}
};
3、解析与序列化
//解析
std::string s = R"(
{
"name": "Judd Trump",
"credits": 1754500,
"ranking": 1
}
)";
auto j = json::parse(s);
//序列化
std::string str = j.dump();
4、解析文件
假设一个JS文本文件 c:\test.json 内容如下:
[
{
"name": "Judd Trump",
"credits": 1754500,
"ranking": 1
},
{
"name": "Neil Robertson",
"credits": 1040500,
"ranking": 2
},
{
"name": "Ronnie O'Sullivan",
"credits": 954500,
"ranking": 3
}
]
则解析的代码如下:
json j;
std::ifstream("c:\\test.json") >> j;
5、将JSON对象存为文件
json j;
std::ofstream("d:\\rankings.json") << j;
6、修改JSON对象
json j{
{ "name", "Judd Trump"},
{ "credits", 1754500 },
{"ranking", 1}
};
std::cout << j << endl;
j["name"] = "Wang Daniu"; //j.at("name") = "Wang Daniu";
std::cout << j << endl;
输出结果:
{"credits":1754500,"name":"Judd Trump","ranking":1} {"credits":1754500,"name":"Ding Junhui","ranking":1}
7、与C++对象互相转换
struct Player{
string name;
int credits;
int ranking;
};
//1.重载转换函数
void to_json(nlohmann::json& j, const Player& p) {
j = json{ {"name", p.name}, {"credits", p.credits}, {"ranking", p.ranking} };
}
void from_json(const nlohmann::json& j, Player& p) {
j.at("name").get_to(p.name);
j.at("credits").get_to(p.credits);
j.at("ranking").get_to(p.ranking);
}
//2.示例
auto j = R"([
{
"name": "Judd Trump",
"credits": 1754500,
"ranking": 1
},
{
"name": "Neil Robertson",
"credits": 1040500,
"ranking": 2
},
{
"name": "Ronnie O'Sullivan",
"credits": 954500,
"ranking": 3
}
])"_json;
std::vector<Player> players = j.get<std::vector<Player>>();
std::cout << "name: " << players[2].name << std::endl;
std::cout << "credits: " << players[2].credits << std::endl;
std::cout << "ranking: " << players[2].ranking << std::endl;