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

如何用nlohmann::json解析curl返回的无外层键JSON数组

问题:nlohmann::json解析无外层键JSON数组时读取字段异常

获取的JSON数据

我通过curl获取到一段无外层键的JSON数组:

[
  {
    "name": "P309",
    "path": "P309",
    "sha": "b9dbfa7ceb9db3b73c84ff326a418bdd50c1b227",
    "type": "file",
    "_links": {
      "self": "https://api.github.com/repos//files/contents/P309?ref=main",
      "git": "https://api.github.com/repos//files/git/blobs/b9dbfdd50c1b227",
      "html": "https://github.com//files/blob/main/P309"
    }
  },
  {
    "name": "P310",
    "path": "P310",
    "sha": "b9dbfa7ceb9db3b73c84ff326a418bdd50c1b227",
    "_links": {
      "self": "https://api.github.com/repos//files/contents/P309?ref=main",
      "git": "https://api.github.com/repos//files/git/blobs/b9dbfdd50c1b227",
      "html": "https://github.com//files/blob/main/P309"
    }
  }
]

参考的示例代码

我参考的示例是解析带外层键的JSON:

/*
  "emulators": [
    {
      "general_info": {
        "dev_id": "0123456789"
      }
    }
  ]
*/
for(json& o : data["emulators"]) {
    json& gi = o["general_info"];
    std::cout << gi["dev_id"] << '\n';
}

自己编写的错误代码

因为我的JSON没有外层键,我写了以下代码尝试解析:

using json = nlohmann::json;
json data = json::parse(downloaded_data);

for(json& o : data[0]) {
   auto git = o["git"].get<std::string>();
   auto name = o["name"].get<std::string>();
}

问题现象

这段代码中git能偶然输出正确值,但读取name时会抛出异常。调试可见data是包含两个对象的数组,而o是数组第一个对象的内部成员(比如键对应的单个值)。

解决方案

问题核心是遍历对象错误:data本身就是顶层数组,不需要取data[0],直接遍历整个data数组即可。data[0]是数组的第一个JSON对象,遍历它的话,o会变成该对象的各个键对应的值——比如当o是字符串"P309"时,访问o["name"]必然异常;只有当o是_links对应的嵌套对象时,o["git"]才有效,这就是为什么偶尔能拿到git值但name总是报错的原因。

修正后的代码:

using json = nlohmann::json;
json data = json::parse(downloaded_data);

// 直接遍历顶层数组data
for(json& o : data) {
   // 从当前对象o中读取name字段
   auto name = o["name"].get<std::string>();
   // 从o的_links嵌套对象中读取git字段
   auto git = o["_links"]["git"].get<std::string>();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:15:40