Ubuntu下使用nlohmann/json解析JSON的C++代码编译报错求助
排查nlohmann/json断言
it != m_data.m_value.object->end()失败的问题 这个断言触发的核心原因是:代码尝试访问JSON对象中不存在的键,且没有提前做存在性校验。以下是具体排查步骤:
1. 先确认JSON数据的有效性
- 打印或导出你要解析的原始JSON内容,检查结构是否符合代码预期:
- 键名是否拼写错误(nlohmann/json对键名大小写敏感)
- 是不是因为yt-dlp版本更新,输出的JSON结构发生了变化(比如某个字段被移除或重命名)
- 可以用Ubuntu自带的
jq工具快速验证JSON结构,比如:echo '你的JSON内容' | jq .
2. 修正JSON键的访问方式
nlohmann/json的[]运算符在debug模式下,访问不存在的键会直接触发断言。建议改用更安全的写法:
- 先用
contains()检查键是否存在:if (json_obj.contains("expected_key")) { auto value = json_obj["expected_key"]; // 后续处理逻辑 } else { std::cerr << "键 expected_key 不存在" << std::endl; } - 或者用
at()方法,它会抛出std::out_of_range异常,方便捕获调试:try { auto value = json_obj.at("expected_key"); } catch (const std::out_of_range& e) { std::cerr << "访问失败:" << e.what() << std::endl; }
3. 检查yt_dlp_cpp源码中的JSON处理
断言失败可能不是你的main.cpp触发的,而是yt_dlp_cpp.cpp内部在处理JSON时的问题:
- 找到yt_dlp_cpp中所有使用
[]访问JSON键的代码,确认是否有未做存在性检查的调用 - 比如如果yt_dlp_cpp假设yt-dlp输出一定包含
duration字段,但实际某些视频的输出中没有这个字段,就会触发断言
4. 验证xmake编译配置
确保xmake.lua正确引入了nlohmann/json库(单头文件库只需配置包含路径):
add_requires("nlohmann_json") target("your_project") set_kind("binary") add_files("main.cpp", "yt_dlp_cpp.cpp") add_packages("nlohmann_json")
另外,注意断言仅在debug编译模式下触发,若临时测试可编译release版本:
xmake f -m release && xmake
5. 用gdb定位具体触发点
如果以上步骤没找到问题,直接用调试工具定位代码行:
- 切换到debug编译:
xmake f -m debug && xmake - 启动gdb调试:
gdb ./build/debug/你的可执行文件名 - 输入
run启动程序,断言失败后输入bt查看调用栈,就能精准找到触发断言的代码位置
内容的提问来源于stack exchange,提问作者Александр Алибеков
相关产品推荐
相关产品推荐

