使用nlohmann的库
“安装”
把include下载到本地可以include的位置
demo
需要再struct和class中实现to_json()和from_json()函数。
貌似cpp20可以通过反射无需手动编写to_json()和from_json(),这里不做展开
#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_jsonfor (auto& pair : Pets) {pair.second.to_json(j["Pets"][pair.first]); // map+对象}for (const auto& pair : Score) { // map+intj["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;}