Ruby on rails 访问深度嵌套数组中的值-Ruby on Rails

Ruby on rails 访问深度嵌套数组中的值-Ruby on Rails,ruby-on-rails,arrays,json,ruby,rails-api,Ruby On Rails,Arrays,Json,Ruby,Rails Api,我正在使用一个返回JSON响应的API调用。我想访问响应中的数据,以便创建一些漂亮的显示卡,显示信息和图片。下面是响应的一个片段,响应属性中填充了大约20个对象。为了简洁起见,我将只包括两个对象: { "success": true, "message": "", "result": [ { "MarketCurrency": "LTC", "BaseCurrency": "BTC",

我正在使用一个返回JSON响应的API调用。我想访问响应中的数据,以便创建一些漂亮的显示卡,显示信息和图片。下面是响应的一个片段,响应属性中填充了大约20个对象。为了简洁起见,我将只包括两个对象:

{
    "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,并尝试将其转换为具有Open struct选项的对象:

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

在我看来,我将这样做
,它显示数组而不是对象。所以我尝试了这个
,它显示了1。如果我这样做,我希望它返回true,但它返回success。所以,我不明白为什么ostruct库不能像我期望的那样工作,也不明白如何访问结果数组中存储的对象。非常感谢您的帮助

您已经有了一个JSON响应,不需要再次使用
来\u 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

您已经有了一个JSON响应,无需再次使用
来_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

经过大量的调试和帮助,我能够让它工作。API调用的响应是一个包含一个项的数组。该项是整个数据集的一个长字符串

为了在呼叫@markets.success时获得预期的“true”行为,我首先必须

raw_markets = JSON.parse(markets.to_json)

@markets = raw_markets.map do |market|
      JSON.parse(market, object_class: OpenStruct)
注:变量markets保存原始api调用:

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

在此之后,我将获得@markets.success=“true”和@markets.result[0]获得第一个结果,@markets.result[1]获得第二个结果,依此类推。

经过大量调试和一些帮助,我能够让它工作。API调用的响应是一个包含一个项的数组。该项是整个数据集的一个长字符串

为了在呼叫@markets.success时获得预期的“true”行为,我首先必须

raw_markets = JSON.parse(markets.to_json)

@markets = raw_markets.map do |market|
      JSON.parse(market, object_class: OpenStruct)
注:变量markets保存原始api调用:

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

在这之后,我会得到@markets.success=“true”和@markets.result[0]保存第一个结果,@markets.result[1]保存第二个结果,依此类推。

如果我删除。对于_json,我会得到这个错误,“没有将Tempfile隐式转换为字符串”。你能说明你请求获取数据的方式吗?如果我删除。对于_json,我会得到这个错误,“没有将Tempfile隐式转换为字符串”。您能说明您请求获取该数据的方式吗?