从google-finance网址获取数据的代码:
uri =URI.parse('http://finance.google.com/finance/info?client=i&q=NSE:ANDHRABANK')
rs = Net::HTTP.get(uri)
rs.delete! '//'
a = JSON.parse(rs)
p a
这是回复:
[{"id"=>"15355585", "t"=>"ANDHRABANK", "e"=>"NSE", "l"=>"49.30", "l_fix"=>"49.30", "l_cur"=>"₹49.30", "s"=>"0", "ltt"=>"3:30PM GMT+5:30", "lt"=>"Jan 13, 3:30PM GMT+5:30", "lt_dts"=>"2017-01-13T15:30:00Z", "c"=>"-0.15", "c_fix"=>"-0.15", "cp"=>"-0.30", "cp_fix"=>"-0.30", "ccol"=>"chr", "pcls_fix"=>"49.45"}]
无法访问JSON数组。想以['t']方式访问数组。
答案 0 :(得分:1)
您可以在阵列上运行循环,然后使用[i] [“t”]或使用[0] [“t”]进行访问。
注意:i是数组元素的索引。
答案 1 :(得分:1)
由于您正在处理数组中的哈希,因此您还必须指定数组元素位置:
require 'json'
require 'net/http'
uri = URI.parse('http://finance.google.com/finance/info?client=i&q=NSE:ANDHRABANK')
rs = Net::HTTP.get(uri)
rs.delete! '//'
a = JSON.parse(rs)
p a.class #=> Array
p a[0]["t"] #=> "ANDHRABANK"
答案 2 :(得分:0)
你自己并不容易。考虑一下:
require 'json'
require 'open-uri'
rs = open('http://finance.google.com/finance/info?client=i&q=NSE:ANDHRABANK').read
foo = JSON[rs[4..-1]].first
foo['t'] # => "ANDHRABANK"
我建议依赖OpenURI或许多可用的HTTP客户端之一,而不是处理Net :: HTTP的复杂性,这对于构建新的HTTP服务更有用。 Net :: HTTP的优点是自动处理重定向和简单性。 OpenURI确实有一些缺点,但对于基本的URL getter来说没关系。
JSON类具有[]
,它足够聪明,可以将字符串转换为相应的Ruby对象。它还会将Ruby对象序列化为String:
puts JSON[{'a' => 1}]
# >> {"a":1}
您正在调用的服务仅返回JSON,在这种情况下,它是包含哈希的单元素数组。使用first
可以轻松检索哈希并正常访问它。这样做比用这种形式撒上代码更清晰:
foo[0]['t']
输入时间较长,会产生视觉噪音。