使用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;
}