阅读来自Google finance api的JSON格式回复

时间:2017-01-13 19:41:58

标签: ruby-on-rails ruby

从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']方式访问数组。

3 个答案:

答案 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"
  1. 我建议依赖OpenURI或许多可用的HTTP客户端之一,而不是处理Net :: HTTP的复杂性,这对于构建新的HTTP服务更有用。 Net :: HTTP的优点是自动处理重定向和简单性。 OpenURI确实有一些缺点,但对于基本的URL getter来说没关系。

  2. JSON类具有[],它足够聪明,可以将字符串转换为相应的Ruby对象。它还会将Ruby对象序列化为String:

    puts JSON[{'a' => 1}]
    # >> {"a":1}
    
  3. 您正在调用的服务仅返回JSON,在这种情况下,它是包含哈希的单元素数组。使用first可以轻松检索哈希并正常访问它。这样做比用这种形式撒上代码更清晰:

    foo[0]['t']
    

    输入时间较长,会产生视觉噪音。