1

我有一个大的 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 导入时,它会将所有 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
4

2 回答 2

2

TL;博士

您有几个问题,其中最重要的是 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"}]
于 2013-08-27T18:12:02.877 回答
1

看起来您正在分别解析每一行。"{" 不是一个完整有效的 JSON 字符串。尝试将所有行连接成一个大字符串并立即解析整个内容。

于 2013-08-27T17:40:55.357 回答