【问题标题】:read all contents of a txt file and parse it to JSON format读取 txt 文件的所有内容并将其解析为 JSON 格式
【发布时间】:2016-10-17 00:24:36
【问题描述】:

demo.txt 文件中:

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

预期结果:

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

我想读取文件的全部内容并将其解析为 JSON 格式,例如 JSON.parse(file_contents)。帮帮我。

我试过这样:

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}]}}'"

【问题讨论】:

  • 你尝试过任何代码逻辑吗?请张贴在这里。
  • 我已经更新了代码。

标签: ruby-on-rails ruby


【解决方案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

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

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])

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

【讨论】:

    【解决方案2】:

    如果你可以用 gsub 或其他东西去掉前导和尾随',它就像

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

    【讨论】:

    • 您能否给出完整的解决方案。谢谢。
    • 已更新快速破解以解决此问题,建议以您保存的输入格式解决此问题,而不是在每次解析时都这样做...
    猜你喜欢
    • 2018-05-14
    • 2021-02-14
    • 2017-04-26
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多