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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:18:00