如何从JSON响应中提取召唤者名称?

时间:2017-04-30 10:48:50

标签: ruby-on-rails json ruby riot-games-api ruby-hash

我正在使用来自英雄联盟的外部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 %>

非常感谢任何帮助。我现在整天都在绊倒这个过程。

2 个答案:

答案 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']

获取值:

  

神保