重新格式化json文件

时间:2013-08-27 17:35:04

标签: ruby-on-rails json

我有一个大的json文件,数据像这样垂直排列

{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blha blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blahblah"
},

如果我尝试使用这样的数据运行rake任务

task :import => :environment do     

      File.open(File.join(Rails.root, "lib", "tasks", "entries.json"), "r") do |file|
      file.each do |line|   
      entry_attrs = JSON.parse(line) if line && line.length >= 2
      Court.create!(entry_attrs)

    end
  end

end

我收到意外的令牌错误

757: unexpected token at '{

如果我手动将json更改为水平线

{ "id": "blah", "jurisdiction": "ny", "name": "blah blah"}

然后导入工作。有没有办法编写rake任务,以便它可以处理以垂直方式组织的json,还是有办法以编程方式将json文件更改为正确的格式?

更新

我把它们放在一个像这样的字符串中。当我运行rake import时,它将所有json打印到屏幕上,最后一个条目后面跟一个逗号

  {
      "Id": "blah",
      "jurisdiction": "ny",
      "name": "blah blah"
    }
'

之后在解析中有一个例外

l/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/json-1.8.0/lib/json/common.rb:155:in `parse'

因此,rake任务永远不会进入我做Court.create!(court)的第二个循环。我不确定是否是这个问题的尾随逗号。

task :import => :environment do 

    File.open(File.join(Rails.root, "lib", "tasks", "file.json"), "r") do |file|
    string = ''
    file.each do |line|      
     string += line     
    end
    court_attrs = JSON.parse(string) if string  
    court_attrs.each do |court|
     Court.create!(court)
    end
  end

end

2 个答案:

答案 0 :(得分:2)

TL; DR

您有几个问题,尤其是JSON不允许使用尾随逗号。另外,多个对象应该嵌套在数组中。但是,如果你有有效的 JSON对象,很容易将它们包装成一个字符串,以便使用插值进行解析。

用字符串

包装JSON对象

您需要将JSON数据转换为对象数组。最简单的方法是将对象包装在数组文字中,然后将整个数组作为字符串返回,以便JSON#parse进行解析。

require 'json'

# Use StringIO to simulate your file on disk.
file = StringIO.new %q/
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blha blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blahblah"
}
/

# Convert file contents to a string
# containing an array of objects.
json = JSON.parse "[#{file.read}]"

这将返回一个哈希数组,这是一个有效的Ruby数据结构。例如,以上将产生:

[{"id"=>"blah", "jurisdiction"=>"ny", "name"=>"blah blah"},
 {"id"=>"blah", "jurisdiction"=>"ny", "name"=>"blah blha blah"},
 {"id"=>"blah", "jurisdiction"=>"ny", "name"=>"blahblah"}]

答案 1 :(得分:1)

看起来你要分别解析每一行。 “{”不是完整有效的JSON字符串。尝试将所有行连接成一个大字符串并立即解析整个字符串。