Ruby:读取json文件得到`[]':无法将String转换为Integer(TypeError)

时间:2013-09-24 07:11:03

标签: ruby json flurry

我正在研究一个接收json文件(来自Flurry API)的Ruby代码,并为“Status Board”应用程序创建另一个json友好格式。使用这个json片段时:

"country":[{"@country":"US","day":[{"@date":"2013-09-20","@value":"1"},
{"@date":"2013-09-   23","@value":"1"}]},
{"@country":"KR","day":{"@date":"2013-09-20","@value":"1"}}

一切正常,但当代码为“KR”,然后是“day”(注意缺少“[]”)时,我收到以下错误:

  • `[]':无法将String转换为Integer(TypeError)

我用来读取原始json文件的代码是:

countries = response.parsed_response["country"]
   countries.each do |datapoint|
      countryName = datapoint["@country"]
      days = datapoint["day"]
      data = []
      days.each do |datapoint2|
          value = datapoint2["@value"]
          date = Date.parse(datapoint2["@date"])
          dateString = date.strftime(dateFormat)
          data << { :title => dateString, :value => value }
      end
      dataSequences << { :title => countryName, :color => metric[:color], :datapoints => data 
   }
   end

我是Ruby中的noob,所以...在读取json文件时可以添加括号以避免此错误吗?

1 个答案:

答案 0 :(得分:0)

Ruby包含一些您可能会觉得有用的类型强制方法。

第一个是Array(),它将其参数转换为数组,除非参数已经是1,它只返回参数:

Array(1) #=> [1]
Array([1,2,3]) #=> [1,2,3]

有点烦人的是,当输入单个哈希时,它会将哈希转换为数组数组(哈希中的键值对):

Array({ a: 1, b: 2}) #=> [[:a, 1], [:b, 2]]

但是,还有一个Hash[]方法会将该结果转换回哈希值,但只保留现有哈希值:

Hash[ [[:a, 1], [:b, 2]] ] #=> { a: 1, b: 2 }

由于您的'day'键有时是一个哈希数组,有时是一个哈希值,因此您可以在方法中使用这些键来确保迭代和查找按预期工作:

Array(datapoint["day"]).each do |datapoint2|
  dp2_hash = Hash[datapoint2]
  # ... etc, substituting future mentions of datapoint2 with dp2_hash