jsoncpp。通过匹配值查找数组中的对象
jsoncpp. find object in array by matching value
我有这个 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");
我有这个 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");