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

How can I extract a Summoner Name from a JSON response?

我正在玩 英雄联盟 的外部 API。到目前为止,我已经能够从 API 获得响应,其中 returns 一个 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", "profileIconId"=>1234, "revisionDate"=>123456789012, "summonerLevel"=>10}}

因此,我能够在我的视图中使用 @summoner 变量输出 JSON 对象。但是当我尝试输出我的 @summoner_name 变量时,我只得到一个空字符串。

供参考,这是我目前的看法:

Summoner Object: <%= @summoner %><br>

Summoner Name: <%= @summoner_name %>

如有任何帮助,我们将不胜感激。我现在一整天都在跌跌撞撞地完成这个过程。

如果您的 json 看起来像这样可能会有所帮助:

{"jimbo"=>{
    "id"=>12345678, 
    "name"=>"Jimbo", 
    "profileIconId"=>1234, 
    "revisionDate"=>123456789012, 
    "summonerLevel"=>10}
    } 

那你就可以

@summoner_jimbo_name = @summoner['jimbo']['name']

获取值:

Jimbo

问题

您没有您认为的哈希值。一旦你解析了你的 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"