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;

}
相关推荐
智者知已应修善业1 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
徐某人..3 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
无敌秋4 小时前
# C++ 简单工厂模式实战指南
c++·简单工厂模式
cany10004 小时前
C++ -- 模板的声明和定义
开发语言·c++
澈2074 小时前
深耕进阶 Day1:C 与 C++ 核心差异 + C++ 入门基石
c语言·开发语言·c++
脱氧核糖核酸__4 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
愚者游世4 小时前
noexcept 说明符与 noexcept运算符各版本异同
开发语言·c++·程序人生·面试·visual studio
极客BIM工作室5 小时前
OCCT开发实践:空间封闭曲线生成曲面的思考与总结
c++