cpp struct json相互转换

简介: 使用 `nlohmann/json`库,可以简便地在C++中实现结构体与JSON之间的相互转换。通过定义序列化和反序列化函数,可以处理简单和复杂的结构体类型。这种方法不仅提高了代码的可读性和维护性,还增强了数据交换的灵活性。

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对象序列化为JSON
    json 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对象序列化为JSON
    json 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;
}
​

结论

使用 nlohmann/json库,可以简便地在C++中实现结构体与JSON之间的相互转换。通过定义序列化和反序列化函数,可以处理简单和复杂的结构体类型。这种方法不仅提高了代码的可读性和维护性,还增强了数据交换的灵活性。

目录
相关文章
|
4月前
|
JSON Go 数据格式
Go实现json字符串与各类struct相互转换
文章通过Go语言示例代码详细演示了如何实现JSON字符串与各类struct之间的相互转换,包括结构体对象生成JSON字符串和JSON字符串映射到struct对象的过程。
38 0
|
SQL JSON Java
知识分享之Golang——在Goland中快速基于JSON或SQL创建struct
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
484 0
知识分享之Golang——在Goland中快速基于JSON或SQL创建struct
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
51 1
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
180 0
在Java中处理JSON数据:Jackson与Gson库比较
|
1月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
2月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
2月前
|
JSON 前端开发 Java
【Spring】“请求“ 之传递 JSON 数据
【Spring】“请求“ 之传递 JSON 数据
99 2