【问题标题】:How do I read JSON received from a REST API?如何读取从 REST API 接收的 JSON?
【发布时间】:2013-08-24 23:48:53
【问题描述】:

我正在尝试读取从 REST API 收到的一些 JSON,但遇到了一些问题。

为了获取我的 JSON,我使用了 Open::URI。我这样创建了我的请求:

require "open-uri"
require "json"
content = open("http://foo.bar/test.json").read
result = JSON.parse(content)

此时我的 JSON 应该是从字符串中解析出来的,所以如果我理解正确,假设我收到的 JSON 具有如下结构,则构建包含我的 JSON 的哈希:

{
   "root":
   {
       "foos":
       {
           "1":
           {
               "title" : "zero",
               "number" : 0
           },
           "2":
           {
               "title" : "twenty",
               "number" : 20
           },
           ...
       }
    }
}

我想遍历每个foos,并为每个人获取标题和编号。我试过这个:

content["root"]["foos"].each do |foo| puts foo.title + " " + foo.number end

但是,作为输出,我得到了:

#<Enumerator:0x007fceb8b33718>

我的错误在哪里?

提前致谢,

【问题讨论】:

  • 您的示例代码不会运行,因为titlenumber 不是字符串的方法。

标签: ruby json api


【解决方案1】:

这是一个选项...遍历 foos 对象内的键。

json = JSON.parse(your_sample_json)
 => {"root"=>{"foos"=>{"1"=>{"title"=>"zero", "number"=>0}, "2"=>{"title"=>"twenty", "number"=>20}}}}

foos = json["root"]["foos"]
 => {"1"=>{"title"=>"zero", "number"=>0}, "2"=>{"title"=>"twenty", "number"=>20}}

foos.keys.each { |key| puts foos[key]["title"] }
zero
twenty

此外,如果您可以控制正在解析的 JSON 对象,则可以将 foos 设为一个数组,而不是一堆编号的对象。

【讨论】:

    【解决方案2】:

    我会这样做:

    require 'json'
    require 'pp'
    
    hash = JSON.parse(
      '{
        "root": {
          "foos": {
            "1": {
              "title": "zero",
              "number": 0
            },
            "2": {
              "title": "twenty",
              "number": 20
            }
          }
        }
      }'
    )
    
    results = hash['root']['foos'].map{ |k, v|
      [v['title'], v['number']]
    }
    
    pp results
    

    运行后输出一个数组数组:

    [["zero", 0], ["twenty", 20]]
    

    map 的行为可能与您对哈希的预期有所不同;它将散列的每个键/值分配为两个元素的数组。键是第一个元素,值是第二个。因为您的结构是散列的散列的散列的散列,所以在迭代 hash['root']['foos'] 时,键 "1""2" 的值是散列,因此您可以像访问散列一样访问它们的值。

    回到你的代码:

    hash["root"]["foos"].each do |foo|
      puts foo.title + " " + foo.number
    end
    

    行不通。它根本不返回枚举数,因此部分问题是不准确的。您的代码返回的是:

    undefined method `title' for ["1", {"title"=>"zero", "number"=>0}]:Array (NoMethodError)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多