cpp struct json相互转换

使用nlohmann的库

"安装"

include下载到本地可以include的位置

demo

需要再struct和class中实现to_json()和from_json()函数。

貌似cpp20可以通过反射无需手动编写to_json()和from_json(),这里不做展开

cpp 复制代码
#include <iostream>
#include "nlohmann/json.hpp"



using nlohmann::json;

struct Dog {
    std::string Name;

	// to_json 和 from_json 需要在同一命名空间下
	void to_json(json& j)
	{
		j["Name"] = Name;
	}

	void from_json(const json& j)
	{
		j.at("Name").get_to(Name);
	}
};

struct Phone {
    std::string Ptype;
    int Pnum;

	// to_json 和 from_json 需要在同一命名空间下
	void to_json(json& j)
	{
        j = {{"Ptype", Ptype},{"Pnum",Pnum}};
	}

	void from_json(const json& j)
	{
		j.at("Ptype").get_to(Ptype);
		j.at("Pnum").get_to(Pnum);
	}
};

struct User {
	std::string Name;
    int Age;
	std::map<std::string, int> Score;
    std::map<std::string, Dog> Pets;
    Phone MPhone;

    // to_json 和 from_json 需要在同一命名空间下
	void to_json(json& j)
	{
		j = json{{"Name", Name}, {"Age", Age}};
        MPhone.to_json(j["MPhone"]);    // 对象属性to_json
        for (auto& pair : Pets) {
            pair.second.to_json(j["Pets"][pair.first]); // map+对象
        }
		for (const auto& pair : Score) {    // map+int
            j["Score"][pair.first] = pair.second;
        }
	}

	void from_json(const json& j)
	{
		j.at("Name").get_to(Name);
		j.at("Age").get_to(Age);
		if(j.contains("Pets")){
            for (const auto& pair : j.at("Pets").items()) {
                Pets[pair.key()] = Dog();
                Pets[pair.key()].from_json(pair.value());
            }
        }
		for (const auto& pair : j.at("Score").items()) {  
            Score[pair.key()] = pair.value();  
        }
	}

	void from_json(std::string json_str)
	{
		json j = json::parse(json_str);
		from_json(j);
	}
};

int main(){
    User user;
    user.Name = "zhangsi";
    user.Age = 25;
    Phone p{"Mi", 1234};
    user.MPhone = p;
    user.Score["math"] = 88;
    user.Score["art"] = 89;
    user.Pets["大黄"] = Dog{"大黄"};
    user.Pets["小黑"] = Dog{"小黑"};

    json j;
    user.to_json(j);
    std::cout << "to_json: " << j.dump() << std::endl;
    std::cout << "to_json with indent:\n" << j.dump(4) << std::endl;

    User new_user;
    new_user.from_json(j);
    std::cout << "\n\nuser from json: User\nName: " << new_user.Name 
        << "\nAge: " << new_user.Age << std::endl;

}
相关推荐
会周易的程序员8 小时前
多模态AI 基于工业级编译技术的PLC数据结构解析与映射工具
数据结构·c++·人工智能·单例模式·信息可视化·架构
lixzest10 小时前
C++上位机软件开发入门深度学习
开发语言·c++·深度学习
苦藤新鸡11 小时前
4.移动零
c++·算法·力扣
hetao173383712 小时前
2026-01-04~06 hetao1733837 的刷题笔记
c++·笔记·算法
liulilittle12 小时前
XDP VNP虚拟以太网关(章节:一)
linux·服务器·开发语言·网络·c++·通信·xdp
Ralph_Y13 小时前
多重继承与虚继承
开发语言·c++
bkspiderx13 小时前
C++虚析构函数:多态场景下的资源安全保障
c++·析构函数·虚函数表·虚析构函数
码界奇点13 小时前
灵活性与高性能兼得KingbaseES 对 JSON 数据的全面支持深度解析
数据库·json·es
White_Can13 小时前
《C++11:列表初始化》
c语言·开发语言·c++·vscode·stl
White_Can13 小时前
《C++11:右值引用与移动语义》
开发语言·c++·stl·c++11