2013-05-27 20 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"]