-1

我正在编写一个接收 json 文件(来自 Flurry API)并为“状态板”应用程序创建另一个 json 友好格式的 Ruby 代码。使用此 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”(注意缺少“[]”)时,我收到以下错误:

  • `[]': 无法将字符串转换为整数 (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 中的菜鸟,所以...可以在读取 json 文件时添加括号以避免此错误?

4

1 回答 1

0

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

第一个是Array(),它将其参数转换为一个数组,除非参数已经是一个,在这种情况下它只是返回参数:

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
于 2013-09-24T07:28:45.343 回答