需求

尝试使用 nlohmman 把复杂的类转为 json。

解决

复杂的类需要对其中的某些部分单独抽出来进行转换。

用于转换为 json 的类

struct VoltageSetConfigData {
    float w1;
    float p1;
    float w2;
    float p2;
    float ref;
    float pf;
};

using VoltageGetConfigData = VoltageSetConfigData;

class VoltageConfigJson {
public:
    std::string name;
    std::vector<VoltageGetConfigData> data;
};

数组单个元素转换

void to_json(json& j, const VoltageGetConfigData& data)
{
    j = json{{"w1", data.w1}, {"p1", data.p1}, {"w2", data.w2}, {"p2", data.p2}, {"ref", data.ref}, {"pf", data.pf}};
}

void from_json(const json& j, VoltageGetConfigData& data)
{
    j.at("w1").get_to(data.w1);
    j.at("p1").get_to(data.p1);
    j.at("w2").get_to(data.w2);
    j.at("p2").get_to(data.p2);
    j.at("ref").get_to(data.ref);
    j.at("pf").get_to(data.pf);
}

整个类的转换

void to_json(json& j, const VoltageConfigJson& config)
{
    j = json{{"config_name", config.name}};

    for (auto & cfg : config.data) {
      json channel;
      to_json(channel, cfg);
      j["config_data"].push_back(channel);
    }
}

void from_json(const json& j, VoltageConfigJson& config)
{
    j.at("config_name").get_to(config.name);

    for (auto & cfg : j["config_data"]) {
      VoltageGetConfigData data;
      from_json(cfg, data);
      config.data.push_back(data);
    }
}
json j;
to_json(j, config_json);

VoltageConfigJson config;
from_json(j, config);

参考

C++ 使用nlohmann解析Json数据&数据对象建模