0

我正在尝试从 last.fm 中获取一些数据并在一个简单的 sinatra 应用程序中使用它。我已经弄清楚如何打开文档,但是在提取 ruby​​ 中的数据时遇到问题,这是我想获取名称的 API 数据的第一个列表:

{"similarartists":{"artist":[{"name":"Sonny & Cher"}]}

这只是返回的摘录,我在我的 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"]

它似乎不起作用我无法在 ruby​​ 1.9.3 上将 String 转换为 Integer (TypeError) 但 JSON 中的名称不是整数?如果我只是输入以下内容:

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

它返回整个东西,但我想抓住它并得到名字。

"name"=>"Interpol"

我不明白为什么当名称是字符串时它会抱怨整数?希望可以有人帮帮我!

4

2 回答 2

2

根据评论线程,问题是对 API 调用返回的数据结构的误解。

确切的问题是该结构在艺术家键下有一系列艺术家,因此要获得您需要做的名称: data['similarartists']['artist'][0]['name']

请注意,只有当您确定只有一位艺术家时,您才应该这样做。返回数据的性质表明情况并非总是如此,因此您最好根据您的使用情况提取所有名称,例如: data['similarartists']['artist'].map {|a| a['name']}.join(',')

这会将所有艺术家姓名以逗号分隔。

将来,您可以通过查看返回数据的完整结构并确保您看到正确的结构来跟踪此问题。API 上的文档也可能在这里提供一些帮助。

您还可以检查是否有人制作了用于访问 API 的 gem。通常,gem 会升级一些原始输出并为您提供一个很好的对象来使用。我建议在 GitHub 上搜索 last.fm gem。

于 2013-05-27T03:41:12.653 回答
1

问题是您正在尝试使用 index 访问 Array "name",Ruby 尝试将其转换为 Integer 并失败,这会导致您看到错误消息。

如果你测试你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 ...

如果您只想要 Interpol 的第一个条目,则可以使用 index [0]

puts data["similarartists"]["artist"][0]["name"]
于 2013-05-27T03:39:07.693 回答