2017-07-08 18 views
0

私はJSON応答を返すAPI呼び出しを使用しています。レスポンス内のデータにアクセスしたいので、情報と写真を表示する素敵なディスプレイカードを作成できます。私はJSON.parseを使用していると私がしようとしている私のRailsのコントローラで深くネストされた配列の値へのアクセス - 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" 
     }, 

:ここでは、応答からの抜粋である、応答性は、私はちょうど2つの簡潔さのために含まれます約20のオブジェクトが移入されますオープン構造体オプション付きオブジェクトにそれを回す:私の見解では

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

私はこれ<%[email protected]%>をやる、それが配列ではなくオブジェクトを示しています。だから私はこれを試してみる<%[email protected]%>そしてそれは1を示します。私が<%[email protected][0]['success']%>をするなら、私はそれが真を返すと思いますが、それは「成功」を返します。だから、私はostructライブラリが私が期待するように動作しない理由、または結果配列に格納されたオブジェクトにどのように到達できるのか理解できません。どんな助けでも大歓迎です!

答えて

2

あなたは既に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呼び出しからの応答は、1つの項目を含む配列でした。項目は、データセット全体の長い文字列でした。

markets.success @呼び出すときに「真」の予想される動作を得るために、私が最初に

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

注意が続く

raw_markets = JSON.parse(markets.to_json) 

に持っていた:変数市場はオリジナルを保持していますAPIの呼び出し:

この後、私は@ markets.success = "true"と@ markets.result [0]を得るでしょうld最初の結果、@ markets.result [1]は2番目の結果を保持し、以下同様に続きます。

関連する問題