读取txt文件的所有内容并将其解析为JSON格式

时间:2016-06-15 18:24:05

标签: ruby-on-rails ruby

demo.txt档案中:

'{
  "cars": {
    "Nissan": [
      {"model":"Sentra", "doors":4},
      {"model":"Maxima", "doors":4}
    ]
  }
}'

预期结果:

{
  "cars" => {
    "Nissan" => [
      {
        "model"=>"Sentra", 
        "doors"=>4
      },
      {
        "model" => "Maxima",
        "doors"=>4
      }
    ]
  }
}

我想阅读文件的全部内容并将其解析为JSON.parse(file_contents)之类的JSON格式。请帮帮我。

我试过了:

file_contents = File.readlines 'demo.txt'  
arr = []
file_contents.each do |d|
  puts arr << d.gsub("\n","")
end
puts arr # ["'{", "\"cars\": {", "\"Nissan\": [", "{\"model\":\"Sentra\", \"doors\":4},", "{\"model\":\"Maxima\", \"doors\":4}", "]", "}", "}'"]

puts arr * '' #"'{\"cars\": {\"Nissan\": [{\"model\":\"Sentra\", \"doors\":4},{\"model\":\"Maxima\", \"doors\":4}]}}'"

2 个答案:

答案 0 :(得分:3)

如果您可以使用gsub或其他内容删除前导和尾随',它就像

一样简单
require 'JSON'
JSON.parse(File.open('demo.txt').read.chop!.reverse.chop!.reverse)

答案 1 :(得分:1)

该文件包含此字符串。

str =
"'{
   \"cars\": {
     \"Nissan\": [
       {\"model\":\"Sentra\", \"doors\":4},
       {\"model\":\"Maxima\", \"doors\":4}
     ]
   }
  }'"
  #=> "'{\n   \"cars\": {\n     \"Nissan\": [\n       {\"model\":\"Sentra\", \"doors\":4},\n       {\"model\":\"Maxima\", \"doors\":4}\n     ]\n   }\n  }'"

让我们创建文件。

FName = 'temp'

File.write(FName, str)
  #=> 152 

我们可以在删除单引号后对JSON进行解析。

require 'json'

JSON.parse(File.read(FName)[1..-2])
  #=> {"cars"=>{"Nissan"=>[{"model"=>"Sentra", "doors"=>4},
  #                        {"model"=>"Maxima", "doors"=>4}]}} 

如果文件的最后一行以换行符结尾,则该文件为

str1 = str + "\n"
  #=> "'{\n   \"cars\": {\n     \"Nissan\": [\n       {\"model\":\"Sentra\", \"doors\":4},\n       {\"model\":\"Maxima\", \"doors\":4}\n     ]\n   }\n  }'\n" 
File.write(FName, str1)
  #=> 153

在这种情况下,我们需要在chomp之前[1..-2]

JSON.parse(File.read(FName).chomp[1..-2])
  #=> {"cars"=>{"Nissan"=>[{"model"=>"Sentra", "doors"=>4}, {"model"=>"Maxima", "doors"=>4}]}} 

我们可以改为写

JSON.parse(File.read(FName)[1..-3])

但前者的优势在于无论文件是否以换行符结尾都能正常工作。