2014-09-23 125 views
0

我正在使用第三方API。我試圖用Ruby解析JSON。 JSON響應:如何使用Ruby解析JSON數組?

{ 
    "metric_data": { 
    "from": "2014-09-22T23:33:20+00:00", 
    "to": "2014-09-23T00:03:20+00:00", 
    "metrics": [ 
     { 
     "name": "HttpDispatcher", 
     "timeslices": [ 
      { 
      "from": "2014-09-22T23:32:00+00:00", 
      "to": "2014-09-23T00:01:59+00:00", 
      "values": { 
       "requests_per_minute": 85700 
      } 
      } 
     ] 
     } 
    ] 
    } 
} 

我需要訪問的數據是requests_per_minute。由於JSON.parse返回一個Hash,好像我只能夠訪問此使用鍵:

hash = JSON.parse(response.body) 

data = hash["metric_data"] 

上面的代碼會產生一個嵌套的水平下降,類似這樣的:

{ 
    "from": "2014-09-22T23:33:20+00:00", 
    "to": "2014-09-23T00:03:20+00:00", 
    "metrics": [ 
    { 
     "name": "HttpDispatcher", 
     "timeslices": [ 
     { 
      "from": "2014-09-22T23:32:00+00:00", 
      "to": "2014-09-23T00:01:59+00:00", 
      "values": { 
      "requests_per_minute": 85700 
      } 
     } 
     ] 
    } 
    ] 
} 

但是,如果我嘗試拼圖任何進一步的響應成爲一個數組,我收到一個錯誤:

data = hash["metric_data"]["metrics"]["timeslices"] 

no implicit conversion of String into Integer (TypeError) 

我相信錯誤是"metrics""timeslices"看起來是JSON數組,使用[]而不是{}。我真的需要一個理智的檢查。我在這裏錯過了什麼?我只是想訪問requests_per_minute

+0

'哈希[ 「metric_data」] [ 「指標」] [0] [「timeslices」]' – apneadiving 2014-09-23 18:40:19

回答

3

你是正確的,它的解析 「指標」 和 「時間片」,每個作爲哈希值的數組,所以試試這個:

requests_per_minute = hash["metric_data"]["metrics"][0]["timeslices"][0]["values"]["requests_per_minute"] 
+0

感謝您的回答,我可以訪問RPM。我很好奇它是如何工作的:使用[0]只是允許你訪問每個嵌套數組的第一個元素? – 2014-09-23 18:45:53

+0

是的,正確的。數組以索引爲基礎,首先爲0.假定結果中可以有多個「度量」或「時間片」。 – Donovan 2014-09-23 18:46:38