C++:使用nlohmann json从文件中读取json对象

39

我正在使用nlohmann的json库在C ++中处理JSON对象。最终,我想从文件中读取JSON对象,例如像这样的简单对象。

{
"happy": true,
"pi": 3.141
}

我不太确定如何处理这个问题。在https://github.com/nlohmann上提供了几种从字符串序列化的方式,但似乎不容易扩展到读入文件。有没有人有相关经验?

2个回答

80

更新 2017-07-03,针对现代 C++ 的 JSON 版本 3

自从 版本 3.0 起,json::json(std::ifstream&) 已被弃用。应该使用 json::parse() 代替:

std::ifstream ifs("test.json");
json jf = json::parse(ifs);

std::string str(R"({"json": "beta"})");
json js = json::parse(str);

如需了解如何使用nlohmann的json库的更基础信息,请参阅nlohmann FAQ


JSON for Modern C++版本2的更新

版本2.0以来,json::operator>>()已被弃用。 应改为使用json::json()

std::istringstream ifs("{\"json\": true}");
json j(ifs);
使用json::operator>>(std::istream&)
json j;
std::stringstream ifs("{\"json\": true}");
ifs >> j;

9
嗨,为了2.0.0版本,我添加了一个构造函数以直接处理输入流,这样你就可以写json j(ifs);。查看http://nlohmann.github.io/json/classnlohmann_1_1basic__json_a9857835334d38ba04959e348ca6be208.html#a9857835334d38ba04959e348ca6be208获取更多详情。 - Niels Lohmann
你需要关闭 ifstream 以防止内存泄漏吗? - IntegrateThis
@IntegrateThis 不需要 - ifstream 在超出范围时会关闭流。手动关闭 * fstream 很少这样做。只有在您想要使用相同的 * fstream “关闭”然后“打开”其他内容时才会执行此操作。 - Ted Lyngmo
那么在 std::ifstream 上启用异常处理,以确定文件是否成功打开和读取呢? - BullyWiiPlaza
@YSC:我想启用异常处理来捕获有关从文件加载的错误会更好,对吧? - BullyWiiPlaza
这远远超出了问题的范围。 - YSC

14

构造函数 json j(ifs) 已被弃用,并将在3.0.0版本中删除。自2.0.3版本以来,您应该编写:

std::ifstream ifs("test.json");
json j = json::parse(ifs);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接