2017-07-08 55 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]第二个结果,等等。