如何在 C++ 中使用 boost-属性-tree 从 JSON 文件中读取对象数组

How can I read an array of object from a JSON file using boost-property-tree in C++

我在 C++ 应用程序中使用 boost-属性-tree,我试图在其中读取 JSON 文件 users.json 并将数据存储到对象向量 ( std::vector<User> users;).

JSON 文件看起来是这样的:

{
   "OperatingSystem":"Windows 10",
   "users" :
   [
       {
          "firstName":"John",
          "lastName":"Black"
       },
       {
          "firstName":"Kate",
          "lastName":"Red"
       },
       {
          "firstName":"Robin",
          "lastName":"White"
       }
    ]
}

我已通过以下代码行成功阅读 OperatingSystem 属性:

boost::property_tree::ptree treeRoot;

boost::property_tree::read_json("users.json", treeRoot);

std::string operatingSystem = treeRoot.get<std::string>("OperatingSystem");

std::cout << "OS : " << operatingSystem << std::endl;

而且效果很好。

为了存储用户,我创建了一个用户class。下面可以看到头文件User.hpp

#ifndef USER_H
#define USER_H

#include <iostream>
#include <string>

class User
{
private:
    // Properties
    std::string firstName;
    std::string lastName;

public:
    // Constructors
    User();
    User(std::string firstName, std::string lastName);

    // Getters
    std::string getFirstName();
    std::string getLastName();

    // Setters
    void getFirstName(std::string firstName);
    void getLastName(std::string lastName);
};

#endif // USER_H

和此处的 User.cpp 文件:

#include "User.hpp"
#include <iostream>
#include <string>

// Constructors
User::User()
{
    this->firstName = "";
    this->lastName = "";
}

User::User(std::string firstName,   std::string lastName)
{
    this->firstName = firstName;
    this->lastName = lastName;
}

// Getters
std::string User::getFirstName()
{
    return firstName;
}

std::string User::getLastName()
{
    return lastName;
}

// Setters
void User::getFirstName(std::string firstName)
{
    this->firstName = firstName;
}

void User::getLastName(std::string lastName)
{
    this->lastName = lastName;
}

在我的 main.cpp 中,我试图将用户加载到这样的向量中:

#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include "User.hpp"

int main(int argc, char **argv)
{

    boost::property_tree::ptree treeRoot;

    boost::property_tree::read_json("users.json", treeRoot);

    std::vector<User> users;

    users = treeRoot.get<std::vector<User>>("users");

    return 0;
}

但它不起作用。

如果有人知道如何通过 boost::property_tree::ptree 从 JSON 文件中读取对象数组,请告诉我。

property_tree 中,数组 JSON 被映射到节点(仅称为 ptree)。 node/ptree 是什么?

node/ptree {
  data                              // has data
  list < pair<key,node> > children  // has children
}

在您的输入对象中,您有 属性 users,其值为包含 3 个元素的数组。这些元素映射到三个以空字符串为键的节点。

所以我们有:

"users" node:
    children {"",nodeA}, {"",nodeB}, {"",nodeC}

nodeA,B,C表示数组的元素。数组的每个元素都是具有 2 个属性的对象。像数组这样的对象也被映射到节点中。

所以 nodeA 看起来像:

nodeA:
    children {"firstName",nodeD},{"lastName",nodeE} \ as children we have 2 properties of object

最后,nodeD

nodeD:
    data = John 
    children   emptyList

要获得 用户 属性 调用 get_child().

要遍历所有子项,请在 get 返回的 ptree 上使用 begin\end 方法。 begin\end returns 迭代器与 first 作为键配对,second 作为嵌套的 ptree 实例。

下面的代码遍历数组中的元素:

    boost::property_tree::ptree pt;
    boost::property_tree::read_json("in.json",pt);

    auto it = pt.get_child("users");

    for (auto it2 = it.begin(); it2 != it.end(); ++it2)
    {
        for (auto it3 = it2->second.begin(); it3 != it2->second.end(); ++it3)
        {
            std::cout  << it3->first; // [1]
            std::cout << " : " << it3->second.data() << std::endl;
        }
        // [2]
        std::cout << std::endl;
    }

并打印:

firstName : John
lastName : Black

firstName : Kate
lastName : Red

firstName : Robin
lastName : White

在 [1] 行你应该存储 firstName/lastName 并且在 [2] 行你可以创建新的 User 实例并推入向量。