如何用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
相关产品推荐
相关产品推荐

