You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用API返回的部分JSON信息高效初始化C++结构体A?

如何高效初始化存在缺失字段的C++结构体A

问题背景

给定如下C++结构体A:

struct A {
    bool m_a;
    std::string m_b, m_c;
    float m_d, m_e;
    double m_f;
    time_t m_g;

    A() = default;

    A(
        bool a, std::string b,
        std::string c, float d,
        float e, double f, time_t g
    )
        : m_a(a), m_b(b), m_c(c),
        m_d(d), m_e(e), m_f(f), m_g(g) {};
};

以及存储API返回数据的nlohmann::json对象(部分字段可能缺失):

nlohmann::json j = {
    {"a", "true"},
    {"g", "1660228853"}
    // 可能缺失b、c、d、e、f等字段
};

需要实现高效初始化结构体A,支持API返回字段缺失的场景。

解决方案

方案1:利用nlohmann/json的value()方法处理默认值

nlohmann::json的value()方法可在键不存在时返回指定默认值,结合类型转换逻辑处理API返回的字符串类型数据:

A init_A_from_json(const nlohmann::json& j) {
    A obj;
    // 处理bool类型:API返回"true"/"false"字符串
    std::string a_str = j.value("a", "false");
    obj.m_a = (a_str == "true");
    
    // 字符串类型默认取空串
    obj.m_b = j.value("b", std::string{});
    obj.m_c = j.value("c", std::string{});
    
    // 数值类型默认设为0.0
    obj.m_d = j.value("d", 0.0f);
    obj.m_e = j.value("e", 0.0f);
    obj.m_f = j.value("f", 0.0);
    
    // 时间戳:字符串转time_t,默认值设为0
    std::string g_str = j.value("g", "0");
    obj.m_g = std::stoll(g_str);
    
    return obj;
}

该方案逻辑直观,无需修改结构体原有定义,逐个字段处理清晰可控。

方案2:重载结构体构造函数

为结构体A新增一个接收nlohmann::json参数的构造函数,内部封装字段缺失处理和类型转换:

struct A {
    bool m_a;
    std::string m_b, m_c;
    float m_d, m_e;
    double m_f;
    time_t m_g;

    A() = default;

    A(
        bool a, std::string b,
        std::string c, float d,
        float e, double f, time_t g
    )
        : m_a(a), m_b(b), m_c(c),
        m_d(d), m_e(e), m_f(f), m_g(g) {};
        
    // 新增:从JSON初始化的构造函数
    explicit A(const nlohmann::json& j) {
        std::string a_str = j.value("a", "false");
        m_a = (a_str == "true");
        
        m_b = j.value("b", std::string{});
        m_c = j.value("c", std::string{});
        
        m_d = j.value("d", 0.0f);
        m_e = j.value("e", 0.0f);
        m_f = j.value("f", 0.0);
        
        std::string g_str = j.value("g", "0");
        m_g = std::stoll(g_str);
    }
};

使用时直接通过A obj(j);完成初始化,符合面向对象封装思想,代码调用更简洁。

方案3:自定义nlohmann/json全局转换规则

如果需要全局复用结构体与JSON的转换逻辑,可自定义adl_serializer,让nlohmann/json自动处理转换:

namespace nlohmann {
    template<>
    struct adl_serializer<A> {
        static A from_json(const json& j) {
            A obj;
            std::string a_str = j.value("a", "false");
            obj.m_a = (a_str == "true");
            
            obj.m_b = j.value("b", std::string{});
            obj.m_c = j.value("c", std::string{});
            
            obj.m_d = j.value("d", 0.0f);
            obj.m_e = j.value("e", 0.0f);
            obj.m_f = j.value("f", 0.0);
            
            std::string g_str = j.value("g", "0");
            obj.m_g = std::stoll(g_str);
            
            return obj;
        }
    };
}

使用时直接调用A obj = j.get<A>();,字段缺失时自动用默认值填充,完全集成到nlohmann/json的序列化体系中。


内容的提问来源于stack exchange,提问作者solid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:45:41