nlohmann的常用用法

devtools/2024/12/26 14:07:43/

3.9之后新增了 2个宏 可以实现 结构体和json的快速转换

1.结构体序列化json

1.1  3.9

#include <iostream>
#include <string>
#include <vector>
#include "json.hpp"// 定义用户结构体
struct User
{std::string name;                 // 用户名int age;                          // 年龄std::vector<std::string> hobbies; // 爱好列表NLOHMANN_DEFINE_TYPE_INTRUSIVE(User, name, age, hobbies)
};// 定义数据结构体
struct Data
{User user;   // 用户信息bool active; // 活跃状态NLOHMANN_DEFINE_TYPE_INTRUSIVE(Data, user, active)
};int main()
{// 创建一个 Data 对象Data data;data.user.name = "Alice";data.user.age = 30;data.user.hobbies = {"Reading", "Traveling", "Swimming"};data.active = true;// 序列化 Data 对象到 JSONnlohmann::json jsonData = data;  //仅一行代码完成序列化std::cout << "Serialized JSON: " << jsonData.dump(4) << std::endl;return 0;
}

1.2 3.9 之前

#include <iostream>
#include <string>
#include <vector>
#include "json.hpp"// 定义用户结构体
struct User
{std::string name;                 // 用户名int age;                          // 年龄std::vector<std::string> hobbies; // 爱好列表friend void to_json(nlohmann::json &nlohmann_json_j, const User &nlohmann_json_t){nlohmann_json_j["name1"] = nlohmann_json_t.name;nlohmann_json_j["age1"] = nlohmann_json_t.age;nlohmann_json_j["hobbies1"] = nlohmann_json_t.hobbies;}
};// 定义数据结构体
struct Data
{User user;   // 用户信息bool active; // 活跃状态friend void to_json(nlohmann::json &nlohmann_json_j, const Data &nlohmann_json_t){nlohmann_json_j["user1"] = nlohmann_json_t.user;nlohmann_json_j["active1"] = nlohmann_json_t.active;}
};int main()
{// 创建一个 Data 对象Data data;data.user.name = "Alice";data.user.age = 30;data.user.hobbies = {"Reading", "Traveling", "Swimming"};data.active = true;// 序列化 Data 对象到 JSONnlohmann::json jsonData = data;std::cout << "Serialized JSON: " << jsonData.dump(4) << std::endl;return 0;
}

2.json反序列化到结构体

2.1 3.9

#include <iostream>
#include <string>
#include <vector>
#include "json.hpp"// 定义用户结构体
struct User
{std::string name; // 用户名int age;          // 年龄std::vector<std::string> hobbies; // 爱好列表// 使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE 宏来定义序列化和反序列化方法NLOHMANN_DEFINE_TYPE_INTRUSIVE(User, name, age, hobbies)
};// 定义数据结构体
struct Data
{User user;   // 用户信息bool active; // 活跃状态// 使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE 宏来定义序列化和反序列化方法NLOHMANN_DEFINE_TYPE_INTRUSIVE(Data, user, active)
};int main()
{// 创建一个 Data 对象std::string jsonstr = R"( 
{"active": true,"user": {"age": 30,"hobbies": ["Reading","Traveling","Swimming"],"name": "Alice"}
})";std::cout << jsonstr << std::endl;nlohmann::json jsonData = nlohmann::json::parse(jsonstr);Data deserializedData;// 反序列化 JSON 到 Data 对象try{deserializedData = jsonData.get<Data>();}catch (std::exception &e){std::cout << "[" << __LINE__ << "]" << e.what() << std::endl;return false;}// 打印反序列化后的数据std::cout << "Deserialized Data:" << std::endl;std::cout << "Name: " << deserializedData.user.name << std::endl;std::cout << "Age: " << deserializedData.user.age << std::endl;std::cout << "Hobbies: ";for (const auto &hobby : deserializedData.user.hobbies){std::cout << hobby << " ";}std::cout << std::endl;std::cout << "Active: " << std::boolalpha << deserializedData.active << std::endl;return 0;
}

2.2 3.9之前

#include <iostream>
#include <string>
#include <vector>
#include "json.hpp"// 定义用户结构体
struct User
{std::string name;                 // 用户名int age;                          // 年龄std::vector<std::string> hobbies; // 爱好列表friend void from_json(const nlohmann::json &nlohmann_json_j, User &nlohmann_json_t){nlohmann_json_j.at("name1").get_to(nlohmann_json_t.name);nlohmann_json_j.at("age1").get_to(nlohmann_json_t.age);nlohmann_json_j.at("hobbies1").get_to(nlohmann_json_t.hobbies);}
};// 定义数据结构体
struct Data
{User user;   // 用户信息bool active; // 活跃状态friend void from_json(const nlohmann::json &nlohmann_json_j, Data &nlohmann_json_t){nlohmann_json_j.at("user1").get_to(nlohmann_json_t.user);nlohmann_json_j.at("active1").get_to(nlohmann_json_t.active);}
};int main()
{// 创建一个 Data 对象std::string jsonstr = R"( 
{"active1": true,"user1": {"age1": 30,"hobbies1": ["Reading","Traveling","Swimming"],"name1": "Alice"}
})";std::cout << jsonstr << std::endl;nlohmann::json jsonData = nlohmann::json::parse(jsonstr);Data deserializedData;// 反序列化 JSON 到 Data 对象try{deserializedData = jsonData.get<Data>();}catch (std::exception &e){std::cout << "[" << __LINE__ << "]" << e.what() << std::endl;return false;}// 打印反序列化后的数据std::cout << "Deserialized Data:" << std::endl;std::cout << "Name: " << deserializedData.user.name << std::endl;std::cout << "Age: " << deserializedData.user.age << std::endl;std::cout << "Hobbies: ";for (const auto &hobby : deserializedData.user.hobbies){std::cout << hobby << " ";}std::cout << std::endl;std::cout << "Active: " << std::boolalpha << deserializedData.active << std::endl;return 0;
}

3.nlohmann的传统用法 序列化和 反序列化

#include <iostream>
#include "json.hpp"
#include <stdexcept>using json = nlohmann::json;int main()
{std::string jsonstr = R"( {"active": true,"user": {"age": 30,"hobbies": ["Reading","Traveling","Swimming"],"name": "Alice"}})";try{json j = json::parse(jsonstr);bool active = false;if (j.contains("active") && j["active"].is_boolean()){active = j["active"];}else{std::cerr << "Warning: 'active' key is missing or not a boolean, using default value: false" << std::endl;}std::string name = "Unknown";if (j.contains("user") && j["user"].contains("name") && j["user"]["name"].is_string()){name = j["user"]["name"];}else{std::cerr << "Warning: 'user.name' key is missing or not a string, using default value: Unknown" << std::endl;}int age = 0;if (j.contains("user") && j["user"].contains("age") && j["user"]["age"].is_number()){age = j["user"]["age"];}else{std::cerr << "Warning: 'user.age' key is missing or not a number, using default value: 0" << std::endl;}std::vector<std::string> hobbies;if (j.contains("user") && j["user"].contains("hobbies") && j["user"]["hobbies"].is_array()){for (const auto &hobby : j["user"]["hobbies"]){if (hobby.is_string()){hobbies.push_back(hobby);}}}else{std::cerr << "Warning: 'user.hobbies' key is missing or not an array, using default value: empty" << std::endl;}std::cout << "Active: " << active << std::endl;std::cout << "Name: " << name << std::endl;std::cout << "Age: " << age << std::endl;std::cout << "Hobbies: ";for (const auto &hobby : hobbies){std::cout << hobby << " ";}std::cout << std::endl;}catch (const std::exception &e){std::cerr << "Error: " << e.what() << std::endl;return 1;}// 组装新的 JSON 报文std::vector<std::string> hobbies;hobbies.push_back("sing");hobbies.push_back("dance");hobbies.push_back("rap");json newJson;newJson["active"] = false;newJson["user"]["name"] = "Blice";newJson["user"]["age"] = 18;newJson["user"]["hobbies"] = hobbies;std::string newJsonStr = newJson.dump(4);std::cout << "New JSON String:\n"<< newJsonStr << std::endl;return 0;
}

4.json特殊字段 空对象 空数组 空字符串  空值

#include <iostream>
#include "json.hpp"int main()
{// 生成空对象nlohmann::json emptyObject = nlohmann::json::object();std::cout << "Empty Object: " << emptyObject << std::endl;// 生成空数组nlohmann::json emptyArray = nlohmann::json::array();std::cout << "Empty Array: " << emptyArray << std::endl;// 生成空字符串nlohmann::json emptyString = "";std::cout << "Empty String: " << emptyString << std::endl;// 生成空值nlohmann::json nullValue = nullptr;std::cout << "Null Value: " << nullValue << std::endl;return 0;
}


http://www.ppmy.cn/devtools/145543.html

相关文章

YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM

如何在增强特征图的同时降低计算成本&#xff0c;以提升模型性能。基于此&#xff0c;MSCAM 模块采用了多尺度卷积注意力机制&#xff0c;通过 CAB、SAB 和 MSCB 三个子模块协同工作。CAB 利用自适应池化和卷积操作生成通道注意力权重&#xff0c;强调重要通道特征&#xff1b;…

修改输出资源的名称和路径、自动清空上次打包资源

一、修改输出资源的名称和路径 1.1 配置 const path require("path");module.exports {// 入口【相对路径】entry: ./src/main.js,// 输出output: {// 文件的输出路径【绝对路径】// __dirname 当前文件的文件夹的绝对路径path: path.resolve(__dirname, dist),/…

Android 之 List 简述

一、简单创建方式 Android 开发中&#xff0c;列表有很多种类&#xff0c;如ArrayList、LinkedList、List、MutableList等&#xff0c;创建列表的方式如下所示&#xff1a; fun listDemo() {// 使用 listOf 创建不可变的空列表val list listOf<Int>()val list1 listOf…

常用的消息中间件都有哪些

在Java编程领域&#xff0c;消息中间件扮演着举足轻重的角色&#xff0c;它们为分布式系统提供了高效、可靠的异步通信机制。 1. RabbitMQ&#xff1a; • 这是一个源自AMQP&#xff08;高级消息队列协议&#xff09;的消息中间件。 • 它提供了丰富的消息路由、过滤和持久化功…

安卓project级别build.gradle和主module的build.gradle

以穿山甲为例讲解 如下图 gradle和gradle插件对应关系 Android Gradle 插件 8.7 版本说明 | Android Studio | Android Developers gradle对应在项目里的配置为 gradle插件对应的位置为

Docker怎么关闭容器开机自启,批量好几个容器一起操作?

环境&#xff1a; WSL2 docker v25 问题描述&#xff1a; Docker怎么关闭容器开机自启&#xff0c;批量好几个容器一起操作&#xff1f; 解决方案&#xff1a; 在 Docker 中&#xff0c;您可以使用多种方法来关闭容器并配置它们是否在系统启动时自动启动。以下是具体步骤和…

期权懂|如何减小个股期权交易中的风险?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何减小个股期权交易中的风险&#xff1f; 一、选择合适的期权合约 &#xff08;1&#xff09;选择活跃的期权合约&#xff1a;投资者应优先选择交易活跃的期权合约。交易活跃的…

达梦数据库-主备集群部署

主备&#xff08;DW&#xff09;集群部署 主备集群为最基础的高可用架构&#xff0c;只有主库对外提供数据库服务&#xff0c;备库仅做备份&#xff0c;根据实际要求及网络条件&#xff0c;可以选择配置为自动切换或者手动切换模式&#xff0c;本次以手动切换模式举例。 1主1备…