如何在Ruby中解析json文件

时间:2019-05-02 18:51:27

标签: json ruby

我有一些关于在ruby中使用json文件的问题。

所以我的JSON文件包含以下信息:

 {
  "2018-12-11": {
    "USD": 1.1379,
    "JPY": 128.75,
    "BGN": 1.9558,
    "CZK": 25.845,
    "DKK": 7.4641,
    "GBP": 0.90228,
    "HUF": 323.4,
    "PLN": 4.2983,
    "RON": 4.6557,
    "SEK": 10.297,
    "CHF": 1.1248,
    "ISK": 140.2,
    "NOK": 9.7038,
    "HRK": 7.3943,
    "RUB": 75.5225,
    "TRY": 6.1295,
    "AUD": 1.5778,
    "BRL": 4.4417,
    "CAD": 1.5239,
    "CNY": 7.8498,
    "HKD": 8.8934,
    "IDR": 16625.0,
    "ILS": 4.2691,
    "INR": 81.8215,
    "KRW": 1284.17,
    "MXN": 23.0209,
    "MYR": 4.7615,
    "NZD": 1.6526,
    "PHP": 60.009,
    "SGD": 1.5617,
    "THB": 37.317,
    "ZAR": 16.2903
  },
  "2018-12-10": {
    "USD": 1.1425,
    "JPY": 128.79,
    "BGN": 1.9558,
    "CZK": 25.866,
    "DKK": 7.4639,
    "GBP": 0.90245,
    "HUF": 323.15,
    "PLN": 4.2921,
    "RON": 4.6502,
    "SEK": 10.333,
    "CHF": 1.1295,
    "ISK": 140.0,
    "NOK": 9.6885,
    "HRK": 7.387,
    "RUB": 75.8985,
    "TRY": 6.0499,
    "AUD": 1.5842,
    "BRL": 4.4524,
    "CAD": 1.5218,
    "CNY": 7.8967,
    "HKD": 8.9283,
    "IDR": 16671.36,
    "ILS": 4.2642,
    "INR": 82.7284,
    "KRW": 1287.42,
    "MXN": 23.132,
    "MYR": 4.7671,
    "NZD": 1.6581,
    "PHP": 60.367,
    "SGD": 1.5667,
    "THB": 37.525,
    "ZAR": 16.3463
  }

我的json文件中还有很多日期。我尝试过

require 'json'

file = File.read('eurofxref-hist-90d.json')

Parse Data from File.data_hash = JSON.parse(file)

我收到错误

在文件<main>': undefined method data_hash ='中

rb:7:表示文件:类(NoMethodError)。

我对Ruby非常陌生,不知道我在做什么。基本上,我想从json文件中获取信息,因此我可以开发一种方法来以浮点数返回from_currencyto_currencydate之间的汇率。

2 个答案:

答案 0 :(得分:3)

您提供的代码很好:

require 'json'
file = File.read('eurofxref-hist-90d.json')
data_hash = JSON.parse(file)

数据问题,请在末尾添加右括号:

{ "2018-12-11": { "USD": 1.1379, "JPY": 128.75, "BGN": 1.9558, "CZK": 25.845, "DKK": 7.4641, "GBP": 0.90228, "HUF": 323.4, "PLN": 4.2983, "RON": 4.6557, "SEK": 10.297, "CHF": 1.1248, "ISK": 140.2, "NOK": 9.7038, "HRK": 7.3943, "RUB": 75.5225, "TRY": 6.1295, "AUD": 1.5778, "BRL": 4.4417, "CAD": 1.5239, "CNY": 7.8498, "HKD": 8.8934, "IDR": 16625.0, "ILS": 4.2691, "INR": 81.8215, "KRW": 1284.17, "MXN": 23.0209, "MYR": 4.7615, "NZD": 1.6526, "PHP": 60.009, "SGD": 1.5617, "THB": 37.317, "ZAR": 16.2903 }, "2018-12-10": { "USD": 1.1425, "JPY": 128.79, "BGN": 1.9558, "CZK": 25.866, "DKK": 7.4639, "GBP": 0.90245, "HUF": 323.15, "PLN": 4.2921, "RON": 4.6502, "SEK": 10.333, "CHF": 1.1295, "ISK": 140.0, "NOK": 9.6885, "HRK": 7.387, "RUB": 75.8985, "TRY": 6.0499, "AUD": 1.5842, "BRL": 4.4524, "CAD": 1.5218, "CNY": 7.8967, "HKD": 8.9283, "IDR": 16671.36, "ILS": 4.2642, "INR": 82.7284, "KRW": 1287.42, "MXN": 23.132, "MYR": 4.7671, "NZD": 1.6581, "PHP": 60.367, "SGD": 1.5667, "THB": 37.525, "ZAR": 16.3463 } }

答案 1 :(得分:1)

将其视为扩展注释而不是答案。 (请不要投票。)

您的JSON字符串实际上看起来像这样:

s=<<-END
{ "2018-12-11": { "USD": 1.1379, "JPY": 128.75, "BGN": 1.9558, "CZK": 25.845, "DKK": 7.4641, "GBP": 0.90228, "HUF": 323.4, "PLN": 4.2983, "RON": 4.6557, "SEK": 10.297, "CHF": 1.1248, "ISK": 140.2, "NOK": 9.7038, "HRK": 7.3943, "RUB": 75.5225, "TRY": 6.1295, "AUD": 1.5778, "BRL": 4.4417, "CAD": 1.5239, "CNY": 7.8498, "HKD": 8.8934, "IDR": 16625.0, "ILS": 4.2691, "INR": 81.8215, "KRW": 1284.17, "MXN": 23.0209, "MYR": 4.7615, "NZD": 1.6526, "PHP": 60.009, "SGD": 1.5617, "THB": 37.317, "ZAR": 16.2903 }, "2018-12-10": { "USD": 1.1425, "JPY": 128.79, "BGN": 1.9558, "CZK": 25.866, "DKK": 7.4639, "GBP": 0.90245, "HUF": 323.15, "PLN": 4.2921, "RON": 4.6502, "SEK": 10.333, "CHF": 1.1295, "ISK": 140.0, "NOK": 9.6885, "HRK": 7.387, "RUB": 75.8985, "TRY": 6.0499, "AUD": 1.5842, "BRL": 4.4524, "CAD": 1.5218, "CNY": 7.8967, "HKD": 8.9283, "IDR": 16671.36, "ILS": 4.2642, "INR": 82.7284, "KRW": 1287.42, "MXN": 23.132, "MYR": 4.7671, "NZD": 1.6581, "PHP": 60.367, "SGD": 1.5667, "THB": 37.525, "ZAR": 16.3463 } }
END
  #=> "    { \"2018-12-11\": { \"USD\": 1.1379, \"JPY\": 128.75, \"BGN\": 1.9558, \"CZK\": 25.845, \"DKK\": 7.4641, \"GBP\": 0.90228, \"HUF\": 323.4, \"PLN\": 4.2983, \"RON\": 4.6557, \"SEK\": 10.297, \"CHF\": 1.1248, \"ISK\": 140.2, \"NOK\": 9.7038, \"HRK\": 7.3943, \"RUB\": 75.5225, \"TRY\": 6.1295, \"AUD\": 1.5778, \"BRL\": 4.4417, \"CAD\": 1.5239, \"CNY\": 7.8498, \"HKD\": 8.8934, \"IDR\": 16625.0, \"ILS\": 4.2691, \"INR\": 81.8215, \"KRW\": 1284.17, \"MXN\": 23.0209, \"MYR\": 4.7615, \"NZD\": 1.6526, \"PHP\": 60.009, \"SGD\": 1.5617, \"THB\": 37.317, \"ZAR\": 16.2903 }, \"2018-12-10\": { \"USD\": 1.1425, \"JPY\": 128.79, \"BGN\": 1.9558, \"CZK\": 25.866, \"DKK\": 7.4639, \"GBP\": 0.90245, \"HUF\": 323.15, \"PLN\": 4.2921, \"RON\": 4.6502, \"SEK\": 10.333, \"CHF\": 1.1295, \"ISK\": 140.0, \"NOK\": 9.6885, \"HRK\": 7.387, \"RUB\": 75.8985, \"TRY\": 6.0499, \"AUD\": 1.5842, \"BRL\": 4.4524, \"CAD\": 1.5218, \"CNY\": 7.8967, \"HKD\": 8.9283, \"IDR\": 16671.36, \"ILS\": 4.2642, \"INR\": 82.7284, \"KRW\": 1287.42, \"MXN\": 23.132, \"MYR\": 4.7671, \"NZD\": 1.6581, \"PHP\": 60.367, \"SGD\": 1.5667, \"THB\": 37.525, \"ZAR\": 16.3463 } }\n"

让我们首先将该字符串写入文件。

FName = 'test'

File.write(FName, s)
  #=> 1013 (number of characters written)

现在我们可以读取文件并将字符串转换为哈希:

require 'json'

JSON.parse(File.read(FName))
  #=> {"2018-12-11"=>{"USD"=>1.1379, "JPY"=>128.75, "BGN"=>1.9558, "CZK"=>25.845,
  #      "DKK"=>7.4641, "GBP"=>0.90228, "HUF"=>323.4, "PLN"=>4.2983, "RON"=>4.6557,
  #      "SEK"=>10.297, "CHF"=>1.1248, "ISK"=>140.2, "NOK"=>9.7038, "HRK"=>7.3943,
  #      "RUB"=>75.5225, "TRY"=>6.1295, "AUD"=>1.5778, "BRL"=>4.4417, "CAD"=>1.5239,
  #      "CNY"=>7.8498, "HKD"=>8.8934, "IDR"=>16625.0, "ILS"=>4.2691, "INR"=>81.8215,
  #      "KRW"=>1284.17, "MXN"=>23.0209, "MYR"=>4.7615, "NZD"=>1.6526, "PHP"=>60.009,
  #      "SGD"=>1.5617, "THB"=>37.317, "ZAR"=>16.2903},
  #    "2018-12-10"=>{"USD"=>1.1425, "JPY"=>128.79, "BGN"=>1.9558, "CZK"=>25.866,
  #      "DKK"=>7.4639, "GBP"=>0.90245, "HUF"=>323.15, "PLN"=>4.2921, "RON"=>4.6502,
  #      "SEK"=>10.333, "CHF"=>1.1295, "ISK"=>140.0, "NOK"=>9.6885, "HRK"=>7.387,
  #      "RUB"=>75.8985, "TRY"=>6.0499, "AUD"=>1.5842, "BRL"=>4.4524, "CAD"=>1.5218,
  #      "CNY"=>7.8967, "HKD"=>8.9283, "IDR"=>16671.36, "ILS"=>4.2642, "INR"=>82.7284,
  #      "KRW"=>1287.42, "MXN"=>23.132, "MYR"=>4.7671, "NZD"=>1.6581, "PHP"=>60.367,
  #      "SGD"=>1.5667, "THB"=>37.525, "ZAR"=>16.3463}} 

请注意

s=<<-END
...
END

heredoc。这是构造包含引号的长字符串的便捷方法。

相关问题