【问题标题】:How can I extract a Summoner Name from a JSON response?如何从 JSON 响应中提取召唤者名称?
【发布时间】:2017-04-30 10:48:49
【问题描述】:

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

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

【问题讨论】:

  • 我建议您阅读有关 ruby​​ 哈希的基本教程。 rubylearning.com/satishtalim/ruby_hashes.html
  • @Зелёный 公平地说,这是一个很好的问题,因为 JSON 有时会包装响应,这对于 API 使用者来说并非总是不言而喻的。嵌套(但名称相似)键是 JSON 的常见问题。

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


【解决方案1】:

问题

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

【讨论】:

  • 非常感谢。 Alejandro 的回复非常有帮助,但是你关于 Hash#dig 的那句话对我来说更有吸引力。我一定会考虑使用它。
【解决方案2】:

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

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

那你就可以了

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

获取值:

金宝

【讨论】:

  • 谢谢你,澄清了我如何看待 JSON 对象的问题。
  • 伟大的@Xadren :)
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
相关资源
最近更新 更多