C++【nlohmann/json】库序列化与反序列化
1.nlohmann/json官方网站
GitHub - nlohmann/json: JSON for Modern C++
Overvew - JSON for Modern C++
上述是点击就进入,下面的是要自己粘
https://github.com/nlohmann/json
https://json.nlohmann.me/api/basic_json/
2.使用过的nlohmann/json官方中的某版本代码
- 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
// | | |__ | | | | | | version 3.11.3
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT
3.nlohmann库的序列化与反序列化简单使用demo
发送方:C++对象转json对象,将json对象转json字符串,然后以字节流发过来;
接收方:需对字节流转成 string类型(json字符串)->使用json::parse转成json对象(json对象根据双方信号协议定义多种id)->赋值给自定义的C++对象
项目思想:发送和接收端中间定义复用的nlohmann::json::number_integer_t id(枚举结构体)
namespace Linshi {
// NLOHMANN_DEFINE_TYPE_INTRUSIVE(key,成员,成员);
// 头文件中定义序列化与反序列化使用的结构体
struct Test {
int type;
int color;
int id;
std::vector<std::pair<double, double>> point;
NLOHMANN_DEFINE_TYPE_INTRUSIVE(Test , type, color, id, point);
};
struct Tests {
std::vector<Test> tests;
NLOHMANN_DEFINE_TYPE_INTRUSIVE(Tests , tests);
}; }
// 头文件搞个模板/或者直接使用json成员函数进行序列、反序列
// 序列化
const Linshi::Test test_js = {}; // 自定义C++对象初始值
nlohmann::json json_obj(test_js); // json对象赋值方式1
json_obj = {{"type",test_js.type},{"color",test_js.color},{"关键字成员",成员C++值}};//赋值方式1
std::string json_str = json_obj.dump();
// 反序列化
{
// const char* msg 假设是Tests 的json字符串
nlohmann::json json_obj_ = nlohmann::json::parse(msg);
// at入参关键字进行解析json,at函数在json库有两种:非常量和常量JSON 对象
Linshi::Test test_obj = json_obj_.at(Tests).at(Test);
Linshi::Tests tests_obj = json_obj_.at(Tests);
}