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

使用nlohmann/json库解析JSON无结果,求正确获取general_info的方法

解决nlohmann/json解析时获取general_info块的问题

你完全找对了问题所在!tmp.m_general_info = &get_general_info(elem[GENERAL_INFO]);这行代码的核心问题是你取了一个局部对象的地址:

get_general_info函数返回的是emulator_context::GeneralInfo类型的值,这个对象在函数返回后就会被销毁,你保存的指针会变成悬垂指针——指向一块已经被释放的内存,自然无法获取到有效数据,甚至可能导致程序崩溃。

下面是几种正确的解决方法,按推荐程度排序:

1. 使用值类型替代指针(最推荐)

修改EmulatorContextObj的定义,把m_general_info从指针类型改成值类型:

// 在emulator_context命名空间下的EmulatorContextObj定义
struct EmulatorContextObj {
    // 把原有的 emulator_context::GeneralInfo* m_general_info; 改成:
    emulator_context::GeneralInfo m_general_info;
    // 其他成员...
};

然后修改解析代码中的赋值语句:

// 直接赋值,不需要取地址
tmp.m_general_info = get_general_info(elem[GENERAL_INFO]);

这种方式完全避免了指针带来的内存管理问题,代码更安全、易维护。

2. 使用动态分配内存(需手动管理)

如果必须保留指针类型,可以通过new动态分配对象:

// 用new创建对象,将返回的指针赋值给m_general_info
tmp.m_general_info = new emulator_context::GeneralInfo(get_general_info(elem[GENERAL_INFO]));

⚠️ 注意:这种方式需要你在后续不再使用EmulatorContextObj时,手动调用delete tmp.m_general_info;来释放内存,否则会造成内存泄漏。

3. 使用智能指针(安全的指针方案)

推荐用C++智能指针来自动管理内存,修改EmulatorContextObj的成员为std::unique_ptr:

#include <memory>

struct EmulatorContextObj {
    std::unique_ptr<emulator_context::GeneralInfo> m_general_info;
    // 其他成员...
};

然后在解析时用std::make_unique创建对象:

tmp.m_general_info = std::make_unique<emulator_context::GeneralInfo>(get_general_info(elem[GENERAL_INFO]));

智能指针会在对象生命周期结束时自动释放内存,无需手动管理,兼顾了指针的灵活性和内存安全性。


额外的潜在问题提醒

  1. JSON键的安全访问:
    你当前用elem[GENERAL_INFO]访问键,如果JSON中不存在"general_info"键,nlohmann/json的operator[]会自动插入一个默认的空对象,这可能不是你想要的行为。建议改用at()方法来访问,这样当键不存在时会抛出异常,方便你捕获错误:

    // 替换 elem[GENERAL_INFO] 为 elem.at(GENERAL_INFO)
    tmp.m_general_info = get_general_info(elem.at(GENERAL_INFO));
    
  2. 类型不匹配问题:
    你的JSON中"serial_num"是字符串类型("my_serial_num"),但代码中用get<int>()尝试转成整数,这会抛出异常。需要把代码改成:

    generalInfo.m_serial_num = json.at(SERIAL_NUM).get<std::string>();
    

    或者确认JSON中的serial_num是否应该是整数类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:37:40