1

我正在玩英雄联盟的外部 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", "profileIconId"=>1234, "revisionDate"=>123456789012, "summonerLevel"=>10}}

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

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

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

Summoner Name: <%= @summoner_name %>

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

4

2 回答 2

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
  }
}

解决方案

要获得名称键,您必须更深入地研究散列。例如,您可以像这样使用Hash#dig

@summoner_name = @summoner.dig 'jimbo', 'name'
#=> "Jimbo"

如果您使用的是没有 Hash#dig 方法的旧 Ruby,那么您仍然可以通过指定子键来获取该值,如下所示:

@summoner_name = @summoner['jimbo']['name']
#=> "Jimbo"
于 2017-05-01T00:58:28.523 回答
1

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

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

然后你可以做

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

获取值:

金博

于 2017-04-30T11:05:33.550 回答