使用nlohmann/json库解析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]));
智能指针会在对象生命周期结束时自动释放内存,无需手动管理,兼顾了指针的灵活性和内存安全性。
额外的潜在问题提醒
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));类型不匹配问题:
你的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

