【问题标题】:Rails how to display hash from JSON requestRails如何显示来自JSON请求的哈希
【发布时间】:2023-03-25 16:15:01
【问题描述】:

我正在尝试从我的 JSON 请求中显示哈希的内部级别。

这是 JSON 请求的返回:

{
    "results": [
    {
    "utc_offset": -25200000,
    "venue": {
      "zip": "94305",
      "country": "us",
      "localized_country_name": "USA",
      "city": "Stanford",
      "address_1": "750 Escondido Road",
      "name": "Ray's - Graduate Community Center",
      "lon": -122.158386,
      "id": 5612552,
      "state": "CA",
      "lat": 37.423393,
      "repinned": false
    },
    "status": "upcoming"
    },
    {
    "utc_offset": -25200000,
    "venue": {
      "zip": "94306",
      "country": "us",
      "localized_country_name": "USA",
      "city": "Palo Alto",
      "address_1": "25 Churchill Ave",
      "name": "Palo Alto High School",
      "lon": -122.154121,
      "id": 1566333,
      "state": "CA",
      "lat": 37.433186,
      "repinned": false
    },
    "status": "upcoming"
    },
    {
    "utc_offset": -25200000,
    "venue": {
      "zip": "94306",
      "country": "us",
      "localized_country_name": "USA",
      "city": "Palo Alto",
      "address_1": "25 Churchill Ave",
      "name": "Palo Alto High School",
      "lon": -122.154121,
      "id": 1566333,
      "state": "CA",
      "lat": 37.433186,
      "repinned": false
    },
    "status": "upcoming"
    }
    ]
    }
}

我参考过:How to use JSON data returned by API call in Rails 4How to get a second level field from json file using rubyWhy do I get "no implicit conversion of String into Integer (TypeError)"?How to access JSON in Rails?

这有助于我达到这一点,如果我使用返回"Ray's - Graduate Community Center"@result = @api_response["results"][0]["venue"]["name"] 指定数组索引,我可以显示哈希的内部级别。这就是我要显示的内容,但我想显示列表中所有场地的名称,而不仅仅是索引 [0] 处的名称。但我不确定如何遍历索引。

我还可以使用@result = @api_response["results"] 显示散列结果并通过使用:

<% @result.each do |i| %>
  <%= i["venue"] %>
<% end %> 

返回:

{"zip"=>"94305", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Stanford", "address_1"=>"750 Escondido Road", "name"=>"Ray's - Graduate Community Center", "lon"=>-122.158386, "id"=>5612552, "state"=>"CA", "lat"=>37.423393, "repinned"=>false} 
{"zip"=>"94305", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Stanford", "address_1"=>"750 Escondido Road", "name"=>"Ray's - Graduate Community Center", "lon"=>-122.158386, "id"=>5612552, "state"=>"CA", "lat"=>37.423393, "repinned"=>false} 
{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 
{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 

{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 
{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 

但是当我尝试使用这个时:

<% @result.each do |i| %>
  <%= i["venue"]["name"] %> <br />
<% end %> 

我收到 undefined method[]' 的 nil:NilClass` 错误,它不允许我访问我试图显示的“地点”内的“名称”。

我在正确的轨道上吗?有没有更好的方法来显示哈希的内部级别?任何反馈都会有所帮助。谢谢!

【问题讨论】:

    标签: ruby-on-rails json ruby hash


    【解决方案1】:

    您确定results 数组中的每个对象都有venue 字段吗?

    在尝试访问venue 字段之前,请确保查看该对象是否确实存在。在你的控制器中,添加这个

    @result = @api_response["results"].reject {|obj| obj.nil?}
    

    这将删除数组中的任何对象nil

    如果对象存在但venue 字段不存在怎么办?

    <% @result.each do |i| %>
      <%= i.has_key? "venue" ? i["venue"]["name"] : 'Location unspecified' %> <br />
    <% end %> 
    

    如果这看起来很乱,你也可以把它移到一个辅助方法中,比如

    def venue_name(obj)
      obj.has_key? "venue" ? obj["venue"]["name"] : 'Location unspecified'
    end
    

    然后在视图中使用它。

     <% @result.each do |i| %>
      <%= venue_name(i) %> <br/>
     <% end %> 
    

    【讨论】:

    • 感谢您的回复。我尝试了&lt;% @result.each do |i| %&gt; &lt;%= i.has_key? "venue" ? i["venue"]["name"] : 'Location unspecified' %&gt; &lt;br /&gt; &lt;% end %&gt; ,但仍然得到undefined method []' 的 nil:NilClass` 错误。但我现在确实明白,某些results 可能缺少venue,因此会出现错误。
    • @tshckr 这很奇怪。你能显示i["venue"]吗?
    • 是的,这似乎可行,但我随机得到换行符,我认为venue 字段可能是nil?我在上面编辑了我的问题,为i["venue"]返回的内容添加了更多行
    • @tshckr 我已经更新了我的答案。如果有帮助,请告诉我!
    • 对不起,我试过了,但收到了同样的nil 错误。 Shadwell 提供的这些答案:@result.select { |r| r.present? &amp;&amp; r.has_key?('venue') }.each do |i|&lt;%= i.fetch('venue', {}).fetch('name', 'No venue') %&gt; 确实有效。但我并没有试图忽略没有venue 的结果,我也想显示它们,除非使用“TBD”。感谢您的反馈。
    【解决方案2】:

    看起来你在正确的轨道上;只是那里有一个结果,要么是 nil,要么里面没有场地。

    您如何解决问题取决于您想在这些情况下做什么。

    您可以过滤结果以排除没有地点的结果。作为查询的一部分执行此操作会更有效,但您可以这样做:

    @result.select { |r| r.present? && r.has_key?('venue') }.each do |i|
    

    或者,如果场地丢失,您可以输出“无场地”或类似内容。在这种情况下,我倾向于使用fetch。您可以尝试从散列中获取值,但如果键不在散列中,则返回默认值。所以,在你的情况下,你可以这样做:

    <%= i.fetch('venue', {}).fetch('name', 'No venue') %>
    

    这会在结果中查找场地散列,但如果不存在则返回空散列。第二个fetch 然后尝试从该哈希中检索名称,如果找不到,则再次返回'No venue'

    【讨论】:

    • 感谢您的解释,它们都工作得很好。使用fetch,我可以看到哪些条目有'No venue'。一个问题,是否可以在@result.select { |r| r.present? &amp;&amp; r.has_key?('venue') }.each do |i| 中添加'No venue' 消息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2015-06-27
    • 2015-08-09
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多