2015-01-12 15 views
6

Tôi có đối tượng JSON này:jsoncpp. tìm đối tượng trong mảng bằng cách kết hợp giá trị

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

Ví dụ, tôi cần phải tìm một cuốn sách (s) mà quan trọng là author bằng Petr. Tôi có thể làm cái này như thế nào? Ngay bây giờ tôi có đoạn mã này:

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

Xin cảm ơn trước.

+1

Bạn cứ nói "nó không hoạt động". Hãy tham gia thói quen trình bày các mô tả vấn đề cụ thể, cùng với _evidence_. "Nó không hoạt động" về cơ bản là vô ích. –

+0

@LightnessRacesinOrbit Xin chào. Tôi thực sự xin lỗi vì điều đó. Tôi đã đánh dấu giải pháp Barry là chính xác và đó là sự thật. Trong trường hợp của tôi, vấn đề là với IDE CLion của Jetbrains, hiện chỉ có sẵn khi phát hành EAP. Chỉ có một số lỗi với IDE, khi sau khi biên dịch một dự án, nó đã bắt đầu ứng dụng cũ. –

Trả lời

7

Something như thế này nên làm:

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 
} 

Nếu không được C++ 11, thay vào đó sẽ phải làm:

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

cảm ơn bạn. Tôi chỉ nghĩ rằng có một số jsoncpp thanh lịch được xây dựng trong chức năng cho những nhu cầu này. –

+2

@PeterShipilo Tôi sẽ rất ngạc nhiên nếu có - chỉ cần làm điều đó một cách đơn giản có vẻ rất thanh lịch và đơn giản với tôi. – Barry

3

Bạn có thể lặp qua mảng JSON như container 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; 
} 

Sử dụng công cụ như sau:

std::vector<Json::Value> results = SearchInArray(json["books"], "author", "Petr"); 
Các vấn đề liên quan