我正在研究一个接收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”(注意缺少“[]”)时,我收到以下错误:
我用来读取原始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文件时可以添加括号以避免此错误吗?
答案 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