Search code examples
c++jsonjsoncpp

How to save specific values in a list to txt using jsoncpp?


I have yahoo finance json file from which I want to isolate Date,Close and volume from the quote list and save it in the same order with a comma separtion in a single text file. This is my json script.

Json::Value root;   // will contains the root value after parsing.
Json::Reader reader;
bool parsingSuccessful = reader.parse( YahooJson, root );
if(not parsingSuccessful)
 {
   // Report failures and their locations
   // in the document.
   std::cout<<"Failed to parse JSON"<<std::endl
       <<reader.getFormatedErrorMessages()
       <<std::endl;
   return 1;
 }else{
 std::cout<<"\nSucess parsing json\n"<<std::endl;
 std::cout << root<< std::endl;
 std::cout <<"No of Days = "<< root["query"]["count"].asInt() << std::endl;

//below for loop returns an error
 for (auto itr : root["query"]["result"]["quote"]) {
    std::string val = itr.asString();

} 


 }

I was able to succed in fetching the json values and print root["query"]["count"].asInt() but when I go to the list values(quote) I dont know how to iterate through quote (query->result->quote) to get Date,close and volume values?

EDIT

Also tried this method

const Json::Value& quotes = root["query"]["results"]["quote"];
for (int i = 0; i < quotes.size(); i++){
    std::cout << "    Date: " << quotes[i]["Date"].asString();
    std::cout << "   Close: " << quotes[i]["Close"].asFloat();
    std::cout << "  Volume: " << quotes[i]["Volume"].asFloat();
    std::cout << std::endl;
}

It works only when output was Date. For close and volume output it exits with a runtime error message and also this error

what() type is not convertible to string

Solution

  • You haven't specified which JSON library you are using, and I don't know the Yahoo finance data well enough to know the exact field names, but if you are using the JsonCpp library, which has documentation here, and you are asking about how to iterate over a JSON array, then one way to do it using iterators would look something like this

    const Json::Value quote = root["query"]["results"]["quote"];
    for (Json::ValueConstIterator itr = quote.begin(); itr != quote.end(); ++itr)
    {
      const Json::Value date = (*itr)["Date"];
      const Json::Value close = (*itr)["Close"];
      const Json::Value volume = (*itr)["Volume"];
      std::cout << "Date: " << date.asString() << std::endl;
      std::cout << "Close: " << close.asString() << std::endl;
      std::cout << "Volume: " << volume.asString() << std::endl;
    }