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合法的嵌套初始化列表传参,把每组键值对作为独立的二元元素传递,元素之间统一用逗号分隔:
- 显式声明对象类型的写法(语义更清晰,避免和数组类型的初始化列表混淆):
json v2 = json::object({ {"BEGIN", "200"}, {"END", "300"} }); - 利用库的自动类型推导的简写写法:
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
相关产品推荐
相关产品推荐

