0

last.fm からいくつかのデータを取得して、単純なシナトラ アプリで使用しようとしています。ドキュメントを開く方法を考え出しましたが、ルビーでデータを抽出する際に問題が発生しました。これは、名前を取得したい 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']

ただし、アーティストが 1 人しかいないことが確実な場合にのみ、これを行う必要があることに注意してください。戻りデータの性質は、常にそうであるとは限らないことを示唆しているため、次のような使用法に応じてすべての名前を取得する方がよい場合があります。 data['similarartists']['artist'].map {|a| a['name']}.join(',')

これにより、カンマで区切られたすべてのアーティスト名が結合されます。

将来的には、返されたデータの完全な構造を調べて、正しい構造が表示されていることを確認することで、この問題を突き止めることができます。API のドキュメントには、ここでもいくつかのヘルプが示されている場合があります。

また、誰かが API にアクセスするための gem を作成したかどうかを確認することもできます。多くの場合、gem はこの生の出力の一部をレベルアップし、操作するのに適したオブジェクトを提供します。GitHub で last.fm gem を検索することをお勧めします。

于 2013-05-27T03:41:12.653 に答える
1

問題は、インデックス"name"で配列にアクセスしようとしていることです。Ruby はこれを整数に変換しようとして失敗し、表示されているエラー メッセージが表示されます。

をテストするclassと、data["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 に答える