Jsoncpp find an object in an array by matching value

I have this JSON object:

{"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 } ] } 

For example, I need to find a book in which the author key is equal to Petr . How can i do this? Right now I have this piece of code:

 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? } 

Thanks in advance.

+6
source share
2 answers

Something like this should do:

 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 } 

If not C ++ 11, you will need instead:

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

You can iterate over JSON arrays as STL containers:

 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; } 

Use it as follows:

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

Source: https://habr.com/ru/post/980869/


All Articles