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

如何反序列化首个构造参数为nlohmann::json的类?

问题原因与解决方案

核心原因:重载解析优先级冲突

nlohmann/json库在反序列化自定义类型时,会优先尝试隐式转换构造函数,而非通过ADL(参数依赖查找)调用你定义的from_json函数。

你的ExampleClass第一个构造参数是nlohmann::json类型且带默认值,这给了编译器一条更直接的匹配路径:当你把json对象赋值给ExampleClass实例时,编译器会直接调用该构造函数,将整个json对象塞进m_Data成员,完全跳过from_json逻辑——这就是example_two输出里m_String为空、m_Data存了完整原JSON结构的原因。

为什么调整参数顺序就正常?

如果把非json类型参数(比如std::string)放在构造函数首位,编译器无法将json对象隐式转换成std::string,这条构造函数的匹配路径就走不通了。此时编译器才会去查找对应的from_json函数,触发你预期的反序列化逻辑。

两种可行解决办法

  • 调整构造函数参数顺序:把非json类型参数放在前面,切断编译器的隐式转换路径,迫使它调用from_json。
  • 标记构造函数为explicit:给接受json的构造函数加上explicit关键字,禁止隐式转换:
    explicit ExampleClass(json data = json::object(), std::string some_string = "") 
        : m_Data(data), m_String(some_string) {}
    
    之后需要用get<T>显式触发反序列化:
    ExampleClass example_two = json::parse("{...}").get<ExampleClass>();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:20:58