如何在 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
实例并推入向量。
我在 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
实例并推入向量。