簡體   English   中英

如何讀取從REST API收到的JSON?

[英]How do I read JSON received from a REST API?

我正在嘗試閱讀從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並為每個foos獲得標題和數字。 我試過這個:

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

但是,作為輸出,我得到了:

#<Enumerator:0x007fceb8b33718>

我的錯誤在哪里?

提前致謝,

這是一個選項...迭代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成為一個數組,而不是一堆編號的對象。

我這樣做:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM