You need to enable JavaScript to run this app. nlohmann json追加FIRST数组元素时构造对象报语法错误问题
优惠活动
大模型
产品
解决方案
定价
更多

nlohmann json追加FIRST数组元素时构造对象报语法错误问题

nlohmann json构造对象编译错误排查

业务场景

现有已加载的JSON结构如下:

{
    "GLOBAL DATA": {
        "FIRST": [
            {"BEGIN": "0", "END" : "100"}
        ],
        "SECOND": "SomeData",
        "THIRD": "SomeMoreData"
    }
}

需要向FIRST对应的数组中追加新的对象条目,尝试用如下代码构造待插入的json对象:

json v2 = {"BEGIN": "200","END" : "300"};

编译时触发报错:

example1.cpp:34:23: error: expected '}' before ':' token json v2 = {"BEGIN": "200","END" : "300"};

报错根本原因

这个错误和nlohmann json库本身没有关系,是代码不符合C++语言的语法规则:

  • 你写的带冒号的键值对格式是JSON文本的原生语法,不是C++支持的初始化列表语法
  • C++编译器在解析到"BEGIN":位置的冒号时,根本无法匹配合法的语法规则,在还没走到调用nlohmann json构造函数的阶段,就直接抛出了语法错误

正确实现方式

nlohmann json针对C的语法规则做了适配,构造json对象时需要用C合法的嵌套初始化列表传参,把每组键值对作为独立的二元元素传递,元素之间统一用逗号分隔:

  1. 显式声明对象类型的写法(语义更清晰,避免和数组类型的初始化列表混淆):
    json v2 = json::object({
        {"BEGIN", "200"},
        {"END", "300"}
    });
    
  2. 利用库的自动类型推导的简写写法:
    json v2 = {
        {"BEGIN", "200"},
        {"END", "300"}
    };
    

构造好v2之后,直接向目标数组追加即可:

// 假定root为已加载的根JSON对象
root["GLOBAL DATA"]["FIRST"].push_back(v2);

避坑提醒

这个是nlohmann json新手最常踩的语法坑,本质是把JSON文本的语法和C代码的语法搞混了:只要记住写C里的json初始化时,所有键值对都用逗号隔开的二元列表,不要出现JSON里的冒号分隔写法,就能解决这类编译错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 21:45:10