cpp struct json相互转换

news/2025/1/20 12:02:27/文章来源:https://www.cnblogs.com/bbhhh/p/18681087

C++结构体与JSON的相互转换

在现代软件开发中,数据的序列化和反序列化是一个常见的需求。尤其在客户端和服务器之间的数据交换中,JSON因其简单、易读和良好的兼容性而被广泛使用。本文将介绍如何在C++中实现结构体和JSON之间的相互转换,重点介绍使用 nlohmann/json库。

nlohmann/json库简介

nlohmann/json是一个流行的开源JSON库,支持C++11及以上版本。它提供了直观和简洁的接口,能够轻松地将C++对象与JSON数据相互转换。

安装nlohmann/json库

可以通过以下几种方式安装 nlohmann/json库:

  1. 使用包管理器(如vcpkg或Conan):

    vcpkg install nlohmann-json
    ​
     
     
  2. 手动下载库文件,并将 json.hpp包含到你的项目中:

    #include "json.hpp"
    ​
     
     

C++结构体与JSON的相互转换

定义结构体

首先,定义一个C++结构体,例如:

struct Person {std::string name;int age;std::string address;
};
​
 
 

转换函数

为了实现结构体与JSON的相互转换,需要定义两个函数:一个用于序列化(结构体转JSON),另一个用于反序列化(JSON转结构体)。

#include <iostream>
#include <string>
#include "json.hpp"using json = nlohmann::json;struct Person {std::string name;int age;std::string address;
};// 序列化:结构体 -> JSON
void to_json(json& j, const Person& p) {j = json{{"name", p.name}, {"age", p.age}, {"address", p.address}};
}// 反序列化:JSON -> 结构体
void from_json(const json& j, Person& p) {j.at("name").get_to(p.name);j.at("age").get_to(p.age);j.at("address").get_to(p.address);
}
​
 
 

使用示例

int main() {// 创建一个Person对象Person person = {"John Doe", 30, "123 Main St"};// 将Person对象序列化为JSONjson j = person;std::cout << "Serialized JSON: " << j << std::endl;// 将JSON反序列化为Person对象Person new_person = j.get<Person>();std::cout << "Deserialized Person: " << new_person.name << ", " << new_person.age << ", " << new_person.address << std::endl;return 0;
}
​
 
 

处理复杂结构体

如果结构体包含复杂数据类型或嵌套结构体,可以使用相同的方法进行处理。以下是一个示例:

struct Address {std::string city;std::string street;
};struct Employee {std::string name;int age;Address address;
};// 序列化:结构体 -> JSON
void to_json(json& j, const Address& a) {j = json{{"city", a.city}, {"street", a.street}};
}void to_json(json& j, const Employee& e) {j = json{{"name", e.name}, {"age", e.age}, {"address", e.address}};
}// 反序列化:JSON -> 结构体
void from_json(const json& j, Address& a) {j.at("city").get_to(a.city);j.at("street").get_to(a.street);
}void from_json(const json& j, Employee& e) {j.at("name").get_to(e.name);j.at("age").get_to(e.age);j.at("address").get_to(e.address);
}int main() {// 创建一个Employee对象Address address = {"New York", "5th Avenue"};Employee employee = {"Alice", 28, address};// 将Employee对象序列化为JSONjson j = employee;std::cout << "Serialized JSON: " << j << std::endl;// 将JSON反序列化为Employee对象Employee new_employee = j.get<Employee>();std::cout << "Deserialized Employee: " << new_employee.name << ", " << new_employee.age << ", " << new_employee.address.city << ", " << new_employee.address.street << std::endl;return 0;
}
​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872068.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用效率驱动增长:直播团队如何协同工作?

一、企业增长离不开效率提升 在直播电商领域,企业的增长速度往往与团队运营效率息息相关。一个高效的直播团队不仅可以降低运营成本,还能快速响应市场需求,抓住增长机遇。然而,大多数团队仍在效率优化上存在不足。二、直播团队效率低下的常见问题- 1. 任务堆积:未能合理分…

2025年安卓苹果手机有哪些好用的日记本app推荐?

进入2025年,有很多人想要直接在手机上随手写每天的日记,那么安卓或苹果手机上有哪些好用的日记本app推荐呢? 今天来介绍四款简单又好用的手机版写日记的app软件,总有一款是适合你的。 一、手机系统自带便签/备忘录/笔记工具 不管你用的是哪款手机,手机上都有系统自带的便签…

Silicon Labs C8051F020 单片机 USB Debug Adapter适配器调试无法连接问题

在做单片机大作业,使用Keil,使用USB连接开发板。想要进入到调试或烧录功能时总是报错: Cannot connect to the selected USB debug adapterToolStick base adapter. Please check that the device is plugged in and not already in use 如图:首先按照老师发的教程逐个复查…

C# PriorityQueue优先队列

namespace PriorityQueueDemo {public class Task{public string Name { get; set; } }public class TaskPriorityComparer : IComparer<(int, int)>{public int Compare((int, int) x, (int, int) y){// 首先比较紧急程度,然后比较重要性int compareUrgency = x.Item1.…

如何修改网站后台登录地址以避免触发安全规则?

在某些情况下,网站后台登录地址可能会触发安全规则,导致无法正常登录。可以通过修改后台登录地址来避免这种情况。以下是具体步骤:修改目录名称:将后台目录名称修改为不包含敏感关键词的名称,例如将admin修改为admin-。 更新配置文件:确保所有配置文件中的后台路径指向新…

Vue2_了解核心概念和一个示例工程

本文做了简要的 Vue2 核心概念和示例工程介绍,包括两种 Vue 实例的挂载方式,并对比两者的区别;简单介绍了响应式,包括 data 对象内的数据,使用计算属性,使用 v-model 双向绑定,使用了 button 和 input 做了交互Vue2_了解核心概念和一个示例工程 写文的目的是为了梳理知识…

如何解决FTP连接超时问题?

在使用FTP连接时,如果遇到超时问题,可能是由于网络配置或服务器设置不当导致的。以下是具体步骤:检查FTP端口:确保FTP端口(默认为21)在服务器防火墙中已开放。 检查本地网络:确保本地网络连接正常,尝试更换网络环境后重新连接。 使用替代FTP地址:如果使用的是特定的FT…

如何下载文件到电脑桌面?

将文件从远程服务器下载到本地电脑桌面的操作看似简单,但对于初次接触此类任务的朋友来说,仍需掌握一些基本技巧。下面我们将详细介绍几种常用的下载方法,帮助您顺利完成操作。 方法一:通过FTP客户端下载 FTP(文件传输协议)是一种广泛应用于互联网上的标准协议,用于在客…

网站登录无响应,如何排查和解决?

您好,当您在尝试登录网站时遇到无响应的情况,这可能是由多种因素引起的。为了帮助您更有效地解决问题,我们将从以下几个方面进行详细分析,并提供相应的解决方案。 1. 服务器状态检查 首先,确保您的云服务器处于正常运行状态。服务器的意外重启或负载过高都可能导致网站无法…

如何解决虚拟主机上的数据库导入失败问题?

当您在虚拟主机上尝试导入数据库时遇到失败,这通常是由几个常见原因造成的。为了帮助您顺利解决问题,我们将从以下几个角度出发,为您提供详细的解决方案。 1. 确认数据库文件格式 首先,确保您要导入的SQL文件是正确的格式,并且与目标数据库版本兼容。不同版本的MySQL/Mari…

如何处理服务器遭受DDoS攻击后被封禁的情况?

当服务器遭遇大规模DDoS攻击并因此被封禁时,用户将面临严重的访问障碍。为了解决这一问题,您可以参考以下详细的解决方案:评估当前状况:首先明确攻击的具体情况,包括流量大小、持续时间以及受影响的服务范围。根据服务商提供的信息,了解封禁政策及其解除条件。一般情况下…

服务器升级配置后无法启动的原因及解决办法

在对服务器进行配置升级后,如果遇到无法启动的情况,可能是由以下几个方面的原因造成的:磁盘分区问题:某些情况下,升级过程中可能会出现磁盘分区丢失或损坏的现象。这会导致系统无法找到根文件系统,从而无法正常启动。此时,可以通过进入单用户模式来修复这个问题。具体做…