我正在使用来自英雄联盟的外部API。到目前为止,我已经能够从API获得响应,它返回一个JSON对象。
@test_summoner_name = ERB::Util.url_encode('Jimbo')
@url = "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/#{@test_summoner_name}?api_key=#{RIOT_API_KEY}"
response = HTTParty.get(@url)
@summoner = JSON.parse(response.body)
@summoner_name = @summoner[:name]
JSON对象如下所示:
{" jimbo" => {" id" => 12345678," name" =>" Jimbo",& #34; profileIconId" => 1234," revisionDate" => 123456789012," summonerLevel" => 10}}
因此,我能够在我的视图中使用 @summoner 变量输出JSON对象。但是当我尝试输出 @summoner_name 变量时,我只得到一个空白字符串。
作为参考,这是我目前的观点:
Summoner Object: <%= @summoner %><br>
Summoner Name: <%= @summoner_name %>
非常感谢任何帮助。我现在整天都在绊倒这个过程。
答案 0 :(得分:2)
你没有你认为你做的哈希。解析完JSON后, @summoner 实例变量实际上包含了一个名为jimbo
的哈希键下包装的所有其他内容。例如,当使用awesome_print gem来漂亮地打印哈希时,您将看到:
require 'awesome_print'
ap @summoner, indent: 2, index: false
{
"jimbo" => {
"id" => 12345678,
"name" => "Jimbo",
"profileIconId" => 1234,
"revisionDate" => 123456789012,
"summonerLevel" => 10
}
}
要获取 name 键,您必须深入了解哈希值。例如,您可以像这样使用Hash#dig:
@summoner_name = @summoner.dig 'jimbo', 'name'
#=> "Jimbo"
如果您在没有Hash#dig方法的情况下使用较旧的Ruby,那么您仍然可以通过指定子键来获取该值,如下所示:
@summoner_name = @summoner['jimbo']['name']
#=> "Jimbo"
答案 1 :(得分:1)
如果你像这样看你的json,它会帮助你:
{"jimbo"=>{
"id"=>12345678,
"name"=>"Jimbo",
"profileIconId"=>1234,
"revisionDate"=>123456789012,
"summonerLevel"=>10}
}
然后你可以做
@summoner_jimbo_name = @summoner['jimbo']['name']
获取值:
神保