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 小时前
C++ qt的安装
c++
小成2023032026514 小时前
C++~07补充
开发语言·c++
hold?fish:palm14 小时前
40 二叉树的直径
c++·leetcode
解决小子15 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
lunar_coder16 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节
白白白小纯16 小时前
C++进阶.多态
c++
凯瑟琳.奥古斯特17 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
xiangyun6118 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
坤坤子吖18 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
qz_Serene18 小时前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节