nlohmann/json的主要用法
阅读数:239 评论数:0
跳转到新版页面分类
C/C++
正文
是一个用于解析json的开源c++库,是github上start最多的c++ 的json库,并且使用非常方便直观。
安装过程就不叙述了,不同的开发工具安装的过程也不太一样。
一、引入头文件
#include "nlohmann/json.hpp"
二、主要用法
1、声明与构造
json j1;
json j2 = json::object();
json j3 = json::array();
2、内容构造
json j = R"(
{
"name": "Judd Trump",
"credits": 1754500,
"ranking": 1
}
)"_json;
或
json j{
{ "name", "Judd Trump"},
{ "credits", 1754500 },
{ "ranking", 1}
};
3、解析与序列化
(1)解析
std::string s = R"(
{
"name": "Judd Trump",
"credits": 1754500,
"ranking": 1
}
)";
auto j = json::parse(s);
(2)序列化
std::string s = j.dump();
(3)文件式
[
{
"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;
4、引用和修改
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;
5、转换成c++对象
(1)定义对象类型
struct Player{
string name;
int credits;
int ranking;
};
(2)重载转换函数
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);
}
(3)转换示例
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;
6、char数组转json对象
std::vector<char> jBuf(jLen - 4 + 1); // +1 为了空终止符
if (inputFile.read(jBuf.data(), jLen - 4)) {
jBuf[jLen - 4] = '\0'; // 确保以空终止符结尾
try {
json jsonObject = json::parse(jBuf.data());
std::cout << "JSON 对象: " << jsonObject.dump(4) << std::endl;
} catch (json::parse_error& e) {
std::cerr << "JSON 解析错误: " << e.what() << std::endl;
return 1;
}
} else {
std::cerr << "读取 JSON 数据失败" << std::endl;
return 1;
}
相关推荐
第1章 认识对象
1.面向对象分析(object-oriented analysis,OOA)的主要任务是分析问题域中的对象、对象之间的关系,然后构造出该问题域的分析模型。分析模型必须简洁、明确地抽象
第一章 C++初步认识
C++对C的“增强”,表现在两个方面:
(1)在原来面向过程的机制基础上,对C语言的功能做了不少扩展
(2)增加了面向对象的机制
面向对象和面向过程不是矛盾的,而是各有用途
C++标准每5年会有一个新版本,1998年的C++98、2003年的C++03、2007年的C++TR1、2011年的C++11.
转换操作符
static_cast
将一个值以符合逻辑的方式转型。这
组织和策略问题
第0条 不要拘泥于小节(了解哪此东本西不应该标准化)
编程规范不应施加个人喜好或者过时的做法。
第1条 在高警告级别干净利落地进行编译
高度重视警告:使用编译器的最高警告级别。应该要求
1、C++版本更迭
年份
C++标准
通用名
别名
标准编译选项
GNU扩展选项
1978
C with Classes
-
-
-
-
1998
ISO/IEC 14882:199
1、转换操作
(1)static_cast
将一个值以符合逻辑的方式转型。这个可以看作是“利用原值重建一个临时对象,并在设立初值时使用型别转换”。唯有当上述型别转换有所定义时,整个转换才会成功。
如:
一、概述
GCC一般包括预处理、编译、组装和链接。GCC的运行一般是调用命令gcc,在cross-compiling时使用machine-gcc或machine-gcc-version,在使用c++时