Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取C+中的嵌套JSON数组和矩阵+; 我必须用C++读取JSON文件中的一些数据。经过一些研究,我发现Boost属性树是最受建议的方法,我能够用简单的字符串启动并运行它。然而,当涉及到深层嵌套数组和矩阵时,我没有找到适合我的解决方案_C++_Json_Boost_Boost Propertytree - Fatal编程技术网

获取C+中的嵌套JSON数组和矩阵+; 我必须用C++读取JSON文件中的一些数据。经过一些研究,我发现Boost属性树是最受建议的方法,我能够用简单的字符串启动并运行它。然而,当涉及到深层嵌套数组和矩阵时,我没有找到适合我的解决方案

获取C+中的嵌套JSON数组和矩阵+; 我必须用C++读取JSON文件中的一些数据。经过一些研究,我发现Boost属性树是最受建议的方法,我能够用简单的字符串启动并运行它。然而,当涉及到深层嵌套数组和矩阵时,我没有找到适合我的解决方案,c++,json,boost,boost-propertytree,C++,Json,Boost,Boost Propertytree,这就是我的JSON文件的样子。可以有多个“对象”及其各自的数据: { "some_data": { (...) }, "objects": [ { "name": "Some name", "id": 0, "array": [ 1.9352999925613403, -1.0619000196456909, 38.685501098632813 ],

这就是我的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”中的数据(两个循环都可以正常工作):

#包括
#包括
#包括
#包括
int main(){
boost::property_tree::ptree root;
boost::property_tree::read_json(“dataFile.json”,root);
std::字符串名;
BOOST\u FOREACH(BOOST::property\u tree::ptree::value\u type&v,root.get\u child(“对象”)){
name=v.second.get(“name”);
}
for(boost::property\u tree::ptree::value\u type&v:root.get\u子对象){
name=v.second.get(“name”);
}
返回0;
}
我的代码是否有类似的方法或一个小小的扩展,允许我获取数组和矩阵的值?我无法在遍历“对象”的循环中嵌套另一个for(each)循环,但也无法立即获取数组或矩阵数据


提前感谢您的帮助

正如我在评论中警告的,Boost属性树不是JSON库。这并不意味着你在这里要求的是不可能的

这是可能的。让我们选择
数组
矩阵
定义:

using Array = std::array<double, 3>;
using Matrix = std::array<std::array<double, 4>, 4>;
事实上,我们可以在同一个实现中捕获两个数组/矩阵:

void read(ptree const& pt, double& into) {
    into = pt.get_value<double>();
}

template <typename ArrayOrMatrix>
void read(ptree const& pt, ArrayOrMatrix& into) {
    auto elements = pt.equal_range(""); // unnamed elements

    assert(boost::size(elements) == into.size());
    auto out = into.begin();
    for (auto& [_,v] : boost::make_iterator_range(elements)) {
        read(v, *out++);
    }
}

正如我在评论中警告的,Boost属性树不是JSON库。这并不意味着你在这里要求的是不可能的

这是可能的。让我们选择
数组
矩阵
定义:

using Array = std::array<double, 3>;
using Matrix = std::array<std::array<double, 4>, 4>;
事实上,我们可以在同一个实现中捕获两个数组/矩阵:

void read(ptree const& pt, double& into) {
    into = pt.get_value<double>();
}

template <typename ArrayOrMatrix>
void read(ptree const& pt, ArrayOrMatrix& into) {
    auto elements = pt.equal_range(""); // unnamed elements

    assert(boost::size(elements) == into.size());
    auto out = into.begin();
    for (auto& [_,v] : boost::make_iterator_range(elements)) {
        read(v, *out++);
    }
}

考虑为此使用一个库,例如。这将使工作更容易。正如
boost
一样,我认为属性树试图为所有人提供一切,因此可能无法完成专用JSON解析器所能完成的一切。最好得到一个JSON解析库,如前一条评论中建议的库。@PaulMcKenzie Boost属性树试图成为属性树。它们支持各种格式的持久性,这些格式是已知格式(如XML、JSON)的子集。这是广泛滥用的目的以外的财产树。而且它“可能不做”当然需要是“它不做”——正如非常清楚地记录的那样,例如。相关:谢谢你的回答,我将在未来与像nlohmann这样的图书馆合作。真的很感激!考虑为此使用一个库,例如。这将使工作更容易。正如
boost
一样,我认为属性树试图为所有人提供一切,因此可能无法完成专用JSON解析器所能完成的一切。最好得到一个JSON解析库,如前一条评论中建议的库。@PaulMcKenzie Boost属性树试图成为属性树。它们支持各种格式的持久性,这些格式是已知格式(如XML、JSON)的子集。这是广泛滥用的目的以外的财产树。而且它“可能不做”当然需要是“它不做”——正如非常清楚地记录的那样,例如。相关:谢谢你的回答,我将在未来与像nlohmann这样的图书馆合作。真的很感激!非常感谢您的详细回答,这段代码对我来说非常适合!非常感谢您的详细回答,这段代码对我来说非常适合!
boost::property_tree::ptree pt;
read_json(iss, pt);

for (auto& [_,obj] : pt.get_child("objects")) {
    std::cout << "Reading object " << std::quoted(obj.get<std::string>("name")) << "\n";
    Array a;
    Matrix m;

    read(obj.get_child("array"), a);
    read(obj.get_child("matrix"), m);
}
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
#include <iomanip>
#include <cassert>

using boost::property_tree::ptree;

using Array = std::array<double, 3>;
using Matrix = std::array<std::array<double, 4>, 4>;

void read(ptree const& pt, double& into) {
    into = pt.get_value<double>();
}

template <typename ArrayOrMatrix>
void read(ptree const& pt, ArrayOrMatrix& into) {
    auto elements = pt.equal_range(""); // unnamed elements

    assert(boost::size(elements) == into.size());
    auto out = into.begin();
    for (auto& [_,v] : boost::make_iterator_range(elements)) {
        read(v, *out++);
    }
}

int main() {

    std::istringstream iss(R"({
    "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 ]
            ],
            "more": {}
        }
    ]
})");

    boost::property_tree::ptree pt;
    read_json(iss, pt);

    for (auto& [_,obj] : pt.get_child("objects")) {
        std::cout << "Reading object " << std::quoted(obj.get<std::string>("name")) << "\n";
        Array a;
        Matrix m;

        read(obj.get_child("array"), a);
        read(obj.get_child("matrix"), m);
    }

    //write_json(std::cout, pt);
}
Reading object "Some name"