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.