Eka Eka - 1 year ago 145
JSON Question

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

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
return 1;
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
but when I go to the list values(
) I dont know how to iterate through quote (query->result->quote) to get Date,close and volume values?


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

Answer Source

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;
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download