【发布时间】:2020-05-13 13:49:49
【问题描述】:
我必须使用 C++ 从 JSON 文件中读取一些数据。经过一些研究,我发现 Boost Property Tree 是最推荐的方法,并且我能够使用简单的字符串启动并运行它。但是,当涉及到深层嵌套数组和矩阵时,我没有找到适合我的解决方案。
这就是我的 JSON 文件的样子。可以有多个“对象”及其数据:
{
"some_data":
{
(...)
},
"objects": [
{
"name": "Some name",
"id": 0,
"array": [ 1.9352999925613403, -1.0619000196456909, 38.685501098632813 ],
"matrix": [
[ -0.74119997024536133, -0.56959998607635498, 0.35519999265670776, 0 ],
[ 0.61210000514984131, -0.35649999976158142, 0.70579999685287476, 0 ],
[ 0.27540001273155212, -0.74059998989105225, -0.6129000186920166, 0 ],
[ 1.9352999925613403, -1.0619000196456909, 38.685501098632813, 1 ]
],
(...)
},
(...)
]
}
我使用以下代码成功检索存储在字符串“name”中的数据(两个循环都可以正常工作):
#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
int main() {
boost::property_tree::ptree root;
boost::property_tree::read_json("dataFile.json", root);
std::string name;
BOOST_FOREACH(boost::property_tree::ptree::value_type& v, root.get_child("objects")) {
name = v.second.get<std::string>("name");
}
for(boost::property_tree::ptree::value_type& v : root.get_child("objects")) {
name = v.second.get<std::string>("name");
}
return 0;
}
是否有类似的方法或对我的代码进行一些扩展以允许我获取数组和矩阵的值?我无法在遍历“对象”的循环中嵌套另一个 for(each) 循环,但也无法一次获取数组或矩阵数据。
提前感谢您的帮助!
【问题讨论】:
-
考虑为此使用库,例如nlohmann json。这将使工作变得更容易。
-
和
boost一样好,我认为property_tree 试图成为所有人的一切,因此可能无法完成专用JSON 解析器能够做的所有事情。最好获得一个 JSON 解析库,例如上一条评论中建议的。 -
@PaulMcKenzie Boost Property Tree 试图成为 Property Tree。它们支持作为已知格式子集的各种格式的持久性(例如 XML、JSON)。这被广泛滥用于属性树以外的目的。而且它“可能不做”当然需要是“它不做” - 非常清楚地记录了例如here。相关:twitter.com/sehetw/status/1125128091611824135
-
感谢您的回答,我将来会使用像 nlohmann 这样的库。真的很感激!
标签: c++ json boost boost-propertytree