2017-01-13 62 views
0

谷歌財經API響應我有這樣的代碼:如何訪問JSON格式陣列

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數組訪問數據。我想訪問像a['t']這樣的數據。

回答

1

要麼你運行循環陣列,然後你可以使用[i] [「t」]或使用[0] [「t」]來訪問。

注意:我是數組元素的索引。

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" 
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. 而不是處理的Net :: HTTP,這是建立新的HTTP服務的工具更有用的複雜性,我建議依託OpenURI,或的一個許多HTTP客戶端可用。 Net :: HTTP的優點是重定向自動處理加簡單。 OpenURI確實有一些缺點,但對於基本的URL獲取者來說沒問題。

  2. JSON類有[],它足夠聰明,可以將字符串轉換爲相應的Ruby對象。它也將序列化Ruby對象回一個字符串:

    puts JSON[{'a' => 1}] 
    # >> {"a":1} 
    
  3. 你調用正在返回JSON的服務,只有在這種情況下,它是包含散列單元素數組。使用first可以輕鬆檢索散列並正常訪問它。這樣做比用這種形式撒上你的代碼要乾淨得多:

    foo[0]['t'] 
    

    這是較長的類型,並導致視覺噪音。