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

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定位具体触发点

如果以上步骤没找到问题,直接用调试工具定位代码行:

  1. 切换到debug编译:
    xmake f -m debug && xmake
    
  2. 启动gdb调试:
    gdb ./build/debug/你的可执行文件名
    
  3. 输入run启动程序,断言失败后输入bt查看调用栈,就能精准找到触发断言的代码位置

内容的提问来源于stack exchange,提问作者Александр Алибеков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:37:32