2013-05-27 64 views
0

我試圖從last.fm獲取一些數據並在簡單的sinatra應用程序中使用它。我已經制定了如何打開文檔,但是在使用ruby提取數據時出現的問題是我想要獲取的API數據的第一個列表:從Ruby遠程API提取JSON值

{「similarartists」:{「artist 「:[{」 Name 「:」 桑尼&雪兒「}]}

這只是返回的提取物,我在我的RB文件中使用這樣的:

require 'json' 
require 'open-uri' 

data = JSON.parse(open("http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=editors&api_key=xxx&format=json").read) 

puts data["similarartists"]["artist"]["name"] 

一點也沒有似乎沒有工作我得到不能將字符串轉換爲整數(類型錯誤)在紅寶石1.9.3但名稱在JS ON不是一個整數?如果我只是把以下內容:

puts data["similarartists"]["artist"] 

它返回整個事情,但我想抓住裏面的名稱。

"name"=>"Interpol" 

我不明白爲什麼它會抱怨整數,當名稱是一個字符串?希望可以有人幫幫我!

+0

是什麼'data'看起來像您嘗試訪問'數據[ 'similarartists'] [ '藝術家'] [ '名']'過嗎?你確定你正在獲取存儲在'data'中的JSON嗎? –

+0

我剛剛完成了一個投入數據,這裏是一個片段開始{「similarartists」=> {「artist」=> [{「name」=>「Interpol」,「mbid」=>「b23e8a63-8f47- 4882-b – calabi

+0

你在mbid的末尾是否缺少'「'?希望我可以測試這個,但我沒有Last.FM API密鑰。 –

回答

2

評論線程,這個問題是對API調用返回的數據結構的誤解。

確切的問題是結構有藝術家的藝術家項下的數組所以要得到這個名字,你需要做的: data['similarartists']['artist'][0]['name']

注意,雖然你只應該做的,如果你是肯定會有隻有一位藝術家。返回數據的性質表明,不會永遠是這樣,所以你可能會更好拉動根據您的使用做類似的所有姓名: data['similarartists']['artist'].map {|a| a['name']}.join(',')

將加入所有的藝術家名字連在一起,用逗號分隔的。

將來,您可以通過查看返回數據的完整結構並確保您看到正確的結構來追蹤此問題。關於API的文檔也可能在這裏指出一些幫助。

您還可能檢查是否有人已經爲訪問該API創建了一個gem。通常情況下,寶石會提升這些原始輸出的一部分,併爲您提供一個很好的工作對象。我建議在GitHub上搜索last.fm的寶石。

1

問題是您試圖訪問索引爲"name"的數組,Ruby嘗試將其轉換爲整數並失敗,導致您看到錯誤消息。

如果你測試classdata["similarartists"]["artist"].class你會看到它返回Array。所以基本上發生的是,JSON.parse()調用創建爲值爲data["similarartists"]["artist"]的哈希數組。要訪問所有的藝術家的名字,你可以通過這個數組只是重複:

require 'json' 
require 'open-uri' 

data = JSON.parse(open("http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=editors&api_key=29da5a0e01ca2d1524cac596d5462d67&format=jso\ 
n").read) 


# iterate through the Array of returned artists and print their names                     
data["similarartists"]["artist"].each do |artist| 
    puts artist["name"] 
end 

# output 
# Interpol 
# White Lies 
# The Cinematics 
# Smith & Burrows 
# The National 
# Julian Plenti 
# She Wants Revenge 
# etc ... 

如果你只想第一進入刑警你可以用指數[0]:基於

puts data["similarartists"]["artist"][0]["name"]