如何使用jsoncpp将列表中的特定值保存到txt?

时间:2016-07-23 11:29:47

标签: c++ json jsoncpp

我有yahoo finance json文件,我希望从quote列表中隔离日期,关闭和音量,并在单个文本文件中以逗号分隔的相同顺序保存。这是我的json脚本。

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();

} 


 }

我能够成功获取json值并打印root["query"]["count"].asInt()但是当我转到列表值(quote)时,我不知道如何遍历引号(query-&gt; result- &gt;引用)获取日期,收盘价和交易量值?

修改

也试过这个方法

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

仅在输出为Date时才有效。对于close和volume输出,它会以运行时错误消息退出,也会出现此错误

what() type is not convertible to string

1 个答案:

答案 0 :(得分:1)

您还没有指定您正在使用哪个JSON库,而且我不太了解Yahoo财务数据以了解确切的字段名称,但是如果您使用的是具有文档的JsonCpp库here,你问的是如何迭代JSON数组,那么使用迭代器的方法就是这样的

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