Jsoncpp - 如何读取数组?
Jsoncpp - How do I read an array?
我无法从 Json 文件中读取数组。
这是 People.json 文件:
{
"ID": [
{
"1": {
"name": "Fred",
"favouriteFood": "Cheese",
"gender": "Male"
}
},
{
"2": {
"name": "Bob",
"favouriteFood": "Cake",
"gender": "Male"
}
}
]
}
这是应该读取它的函数:
Person choosePerson(int ID)
{
Person Person;
ifstream file("People.json");
Json::Value root;
Json::Reader reader;
Json::FastWriter fastWriter;
reader.parse(file, root);
Person.id = ID;
Person.name = fastWriter.write(root["data"][to_string(ID)]["name"]);
Person.favFood = fastWriter.write(root["data"][to_string(ID)]["favouriteFood"]);
Person.gender = fastWriter.write(root["data"][to_string(ID)]["gender"]);
return Person;
}
在 运行 之后我得到一个“Json::LogicError”异常。
问题是您的 JSon 设计不当。这很糟糕,因为对象具有意外值的键。那些 "1"
和 "2"
让事情变得复杂。
我在 documentation 中没有看到如何获取 JSon 对象的键列表。
好的,我找到了 getMemberNames()
,但你自己试试看。 IMO 最好修复此 JSon.
所以在像这样修复 JSon 之后:
{
"ID":[
{
"id":"1",
"name":"Fred",
"favouriteFood":"Cheese",
"gender":"Male"
},
{
"id":"2",
"name":"Bob",
"favouriteFood":"Cake",
"gender":"Male"
}
]
}
读起来可能是这样的:
struct Person {
std::string id;
std::string name;
std::string favouriteFood;
std::string gender;
};
Person personFromJSon(const Json::Value& json)
{
return {
json["id"].asString(),
json["name"].asString(),
json["favouriteFood"].asString(),
json["gender"].asString()
};
}
std::vector<Person> personsFromJSon(const Json::Value& json)
{
if (!json.isArray()) return {};
std::vector<Person> result;
result.reserve(json.size());
std::transform(json.begin(), json.end(), std::back_inserter(result), personFromJSon);
return result;
}
std::vector<Person> personsFromJSon(std::istream& in)
{
Json::Value root;
Json::Reader reader;
reader.parse(in, root);
return personsFromJSon(root["ID"]);
}
这里是live demo.
我无法从 Json 文件中读取数组。
这是 People.json 文件:
{
"ID": [
{
"1": {
"name": "Fred",
"favouriteFood": "Cheese",
"gender": "Male"
}
},
{
"2": {
"name": "Bob",
"favouriteFood": "Cake",
"gender": "Male"
}
}
]
}
这是应该读取它的函数:
Person choosePerson(int ID)
{
Person Person;
ifstream file("People.json");
Json::Value root;
Json::Reader reader;
Json::FastWriter fastWriter;
reader.parse(file, root);
Person.id = ID;
Person.name = fastWriter.write(root["data"][to_string(ID)]["name"]);
Person.favFood = fastWriter.write(root["data"][to_string(ID)]["favouriteFood"]);
Person.gender = fastWriter.write(root["data"][to_string(ID)]["gender"]);
return Person;
}
在 运行 之后我得到一个“Json::LogicError”异常。
问题是您的 JSon 设计不当。这很糟糕,因为对象具有意外值的键。那些 "1"
和 "2"
让事情变得复杂。
我在 documentation 中没有看到如何获取 JSon 对象的键列表。
好的,我找到了 getMemberNames()
,但你自己试试看。 IMO 最好修复此 JSon.
所以在像这样修复 JSon 之后:
{
"ID":[
{
"id":"1",
"name":"Fred",
"favouriteFood":"Cheese",
"gender":"Male"
},
{
"id":"2",
"name":"Bob",
"favouriteFood":"Cake",
"gender":"Male"
}
]
}
读起来可能是这样的:
struct Person {
std::string id;
std::string name;
std::string favouriteFood;
std::string gender;
};
Person personFromJSon(const Json::Value& json)
{
return {
json["id"].asString(),
json["name"].asString(),
json["favouriteFood"].asString(),
json["gender"].asString()
};
}
std::vector<Person> personsFromJSon(const Json::Value& json)
{
if (!json.isArray()) return {};
std::vector<Person> result;
result.reserve(json.size());
std::transform(json.begin(), json.end(), std::back_inserter(result), personFromJSon);
return result;
}
std::vector<Person> personsFromJSon(std::istream& in)
{
Json::Value root;
Json::Reader reader;
reader.parse(in, root);
return personsFromJSon(root["ID"]);
}
这里是live demo.