2017-07-08 56 views
0

我正在使用返回JSON響應的API調用。我想訪問響應中的數據,以便我可以創建一些顯示信息和圖片的好顯示卡。下面是從響應片段,響應屬性與約20個對象填充我將只包括兩個用於簡潔:在深度嵌套數組中訪問值 - Ruby on Rails

{ 
    "success": true, 
    "message": "", 
    "result": [ 
     { 
      "MarketCurrency": "LTC", 
      "BaseCurrency": "BTC", 
      "MarketCurrencyLong": "Litecoin", 
      "BaseCurrencyLong": "Bitcoin", 
      "MinTradeSize": 1e-8, 
      "MarketName": "BTC-LTC", 
      "IsActive": true, 
      "Created": "2014-02-13T00:00:00", 
      "Notice": null, 
      "IsSponsored": null, 
      "LogoUrl": "https://i.imgur.com/R29q3dD.png" 
     }, 
     { 
      "MarketCurrency": "DOGE", 
      "BaseCurrency": "BTC", 
      "MarketCurrencyLong": "Dogecoin", 
      "BaseCurrencyLong": "Bitcoin", 
      "MinTradeSize": 1e-8, 
      "MarketName": "BTC-DOGE", 
      "IsActive": true, 
      "Created": "2014-02-13T00:00:00", 
      "Notice": null, 
      "IsSponsored": null, 
      "LogoUrl": "https://i.imgur.com/e1RS4Hn.png" 
     }, 

在我的Rails控制器我使用JSON.parse和我試圖與開放式結構的選擇把它變成一個對象:

@markets = JSON.parse(markets.to_json, object_class: OpenStruct) 

在我看來,我會做到這一點<%[email protected]%>,它顯示了陣列和沒有反對。所以我嘗試這個<%[email protected]%>它顯示1.如果我做<%[email protected][0]['success']%>我希望它返回true,但它返回'成功'。所以,我不明白爲什麼ostruct庫不能像我期望的那樣工作,或者我可以如何訪問存儲在結果數組中的對象。任何幫助是極大的讚賞!

回答

2

您已經擁有JSON響應,不需要再次使用to_json,只需解析該對象,然後使用點.即可訪問其字段,然後就可以以OpenStruct對象的形式訪問它們,方法如下:

require 'json' 

a = '{ 
    "success": true, 
    "message": "", 
    "result": [{ 
    "MarketCurrency": "LTC", 
    "BaseCurrency": "BTC", 
    "MarketCurrencyLong": "Litecoin", 
    "BaseCurrencyLong": "Bitcoin", 
    "MinTradeSize": 1e-8, 
    "MarketName": "BTC-LTC", 
    "IsActive": true, 
    "Created": "2014-02-13T00:00:00", 
    "Notice": null, 
    "IsSponsored": null, 
    "LogoUrl": "https://i.imgur.com/R29q3dD.png" 
    }, { 
    "MarketCurrency": "DOGE", 
    "BaseCurrency": "BTC", 
    "MarketCurrencyLong": "Dogecoin", 
    "BaseCurrencyLong": "Bitcoin", 
    "MinTradeSize": 1e-8, 
    "MarketName": "BTC-DOGE", 
    "IsActive": true, 
    "Created": "2014-02-13T00:00:00", 
    "Notice": null, 
    "IsSponsored": null, 
    "LogoUrl": "https://i.imgur.com/e1RS4Hn.png" 
    }] 
}' 

b = JSON.parse(a, object_class: OpenStruct) 
p b.success 
# => true 
+0

如果我刪除.to_json,我得到這個錯誤,「沒有將Tempfile隱式轉換爲字符串」。 –

+0

您能否展示您提出請求獲取該數據的方式? –

1

經過很多調試和一些協助,我才得以實現它。來自API調用的響應是一個包含一個項目的數組。該項目是整個數據集的一個很長的字符串。

爲了獲得預期的行爲「真」,呼籲@ markets.success的時候,我首先必須

raw_markets = JSON.parse(markets.to_json) 

其次

@markets = raw_markets.map do |market| 
     JSON.parse(market, object_class: OpenStruct) 

注:市場變量保持原api電話:

markets = open('url-to-api') 

之後,我會得到@ markets.success =「true」和@ markets.result [0]他ld第一個結果,@ markets.result [1]第二個結果,等等。