前言
nlohmann/json 是一個用於解析json的開源c++庫,口碑一流,號稱有業界最好的性能,並且使用非常方便直觀,是很多c++程序員的首選。開源官網處有詳細說明用法,但篇幅過長,不便於迅速閱讀抓重點。而且,所舉例的某些用法實踐上其實比較少用到,而某些實踐上常用到的一些用法,官網卻缺例子。所以自己簡要總結了一下它的主要用法,並加上自己寫的示例,希望能給到新接觸該庫的朋友一些幫助。
准備工作:
下載 https://github.com/nlohmann/json/tree/develop/single_include/nlohmann/json.hpp, 並加入本地工程
引用頭文件:
#include "nlohmann/json.hpp" using json = nlohmann::json;
主要用法:
#1 聲明與構造
##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} };
#2 解析與序列化
字符串:
- 解析
std::string s = R"( { "name": "Judd Trump", "credits": 1754500, "ranking": 1 } )"; auto j = json::parse(s);
- 序列化
std::string s = j.dump();
文件:// 比如有文件 c:\rankings.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:\\rankings.json") >> j;
-
序列化
std::ofstream("d:\\rankings.json") << j;
#3 引用和修改
舉個栗子:
json j{ { "name", "Judd Trump"}, { "credits", 1754500 }, { "ranking", 1} }; std::cout << j << endl; j["name"] = "Ding Junhui"; //j.at("name") = "Ding Junhui";
std::cout << j << endl;
輸出結果:
{"credits":1754500,"name":"Judd Trump","ranking":1}
{"credits":1754500,"name":"Ding Junhui","ranking":1}
#4 轉換成C++對象
定義對象類型
struct Player{ string name; int credits; int ranking; };
重載轉換函數
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); }
轉換示例
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;
輸出結果:
name: Ronnie O'Sullivan credits: 954500 ranking: 3