C++将JSON中结构体元素读取存入std::vector出现push_back匹配报错如何解决
错误原因
- 类型不匹配:
std::vector<structE>的push_back方法仅支持传入structE类型参数,你代码中直接传入Json::Value类型对象,编译器没有找到对应的隐式转换规则,因此抛出匹配失败错误。 - 取值逻辑错误:你已经通过
auto const list= A[i]["list"]拿到了存储结构体数组的JSON节点,循环内部再次写list[i2]["list"]属于重复取list字段,无法拿到a/b/c的实际值。 - 结构体定义不合法:你给出的
structE{ "a", "b", "c" }不是合法的C++结构体定义,需要先声明对应类型的成员变量。
解决步骤
1. 修正结构体定义
首先把structE改成合法的C++结构体,假设JSON中a/b/c都是整数类型,示例如下:
struct structE { int a; int b; int c; };
如果对应字段是字符串、浮点数等其他类型,把成员变量类型改成对应类型即可。
2. 修正读取逻辑
读取JSON字段后手动构造structE实例再存入容器,修正后的代码如下:
if (A[i].isMember("list")) { const Json::Value& list = A[i]["list"]; for (unsigned int i2 = 0; i2 < list.size(); i2++) { // 逐个读取JSON字段构造structE对象 structE elem; elem.a = list[i2]["a"].asInt(); elem.b = list[i2]["b"].asInt(); elem.c = list[i2]["c"].asInt(); vec.push_back(elem); } }
可选简化写法
如果需要简化读取代码,可以给structE新增接收Json::Value的构造函数:
struct structE { int a; int b; int c; // 新增构造函数,直接从Json节点构造实例 explicit structE(const Json::Value& val) : a(val["a"].asInt()), b(val["b"].asInt()), c(val["c"].asInt()) {} }; // 读取代码可简化为: if (A[i].isMember("list")) { const Json::Value& list = A[i]["list"]; for (unsigned int i2 = 0; i2 < list.size(); i2++) { vec.emplace_back(list[i2]); } }
注意事项
- 你给出的JSON示例格式不规范,正确的格式应该是list下每个元素为包含a/b/c的对象,示例如下:
"A": [ { "list": [ {"a": 2, "b": 4, "c": 9}, {"a": 5, "b": 7, "c": 12} ] } ]
- 可在读取字段前增加
isMember判断,避免JSON字段缺失时程序崩溃,例如if(list[i2].isMember("a"))再读取a的值。 - 注意JSON字段类型和结构体成员类型匹配,字符串类型用
asString(),浮点数用asDouble()。
内容的提问来源于stack exchange,提问作者John Leo
相关产品推荐
相关产品推荐

