我一直試圖從 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”例外。
uj5u.com熱心網友回復:
問題是你的 JSon 設計得很糟糕。這很糟糕,因為物件具有意外值的鍵。那些"1"和"2"使事情復雜化。
我在檔案中沒有看到如何獲取 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"]);
}
這是現場演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371603.html
