JSONCPP.通过匹配值查找数组中的对象

jsoncpp. find object in array by matching value

本文关键字:数组 对象 查找 JSONCPP      更新时间:2023-10-16

我有这个JSON对象:

{"books":[
    {
      "author" : "Petr",
      "book_name" : "Test1",
      "pages" : 200,
      "year" : 2002
    },
    {
      "author" : "Petr",
      "book_name" : "Test2",
      "pages" : 0,
      "year" : 0
    },
    {
      "author" : "STO",
      "book_name" : "Rocks",
      "pages" : 100,
      "year" : 2002
    }
  ]
}   

例如,我需要找到一本author键等于Petr的书。我该怎么做?现在我有这段代码:

Json::Value findBook(){
    Json::Value root = getRoot();
    cout<<root["books"].toStyledString()<<endl; //Prints JSON array of books mentioned above
    string searchKey;
    cout<<"Enter search key: ";
    cin>>searchKey;
    string searchValue;
    cout<<"Enter search value: ";
    cin>>searchValue;
    Json::Value foundBooks = root["books"]???; // How can I get here a list of books where searchKey is equal to searchValue?
}

提前谢谢。

这样的事情应该可以:

std::vector<Json::Value> booksByPeter(const Json::Value& root) {
    std::vector<Json::Value> res;
    for (const Json::Value& book : root["books"])  // iterate over "books"
    {
        if (book["author"].asString() == "Petr")   // if by "Petr"
        {
            res.push_back(book);                   // take a copy
        }
    }
    return res;                                    // and return
}

如果不是C++11,则必须执行以下操作:

const Json::Value& books = root["books"];
for (Json::ValueConstIterator it = books.begin(); it != books.end(); ++it)
{
    const Json::Value& book = *it;
    // rest as before
}

您可以将 JSON 数组迭代为 STL 容器:

std::vector<Json::Value> SearchInArray(const Json::Value &json, const std::string &key, const std::string &value)
{
    assert(json.isArray());
    std::vector<Json::Value> results;
    for (size_t i = 0; i != json.size(); i++)
        if (json[i][key].asString() == value)
            results.push_back(json[i]);
    return results;
}

像这样使用它:

std::vector<Json::Value> results = SearchInArray(json["books"], "author", "Petr");