Ruby on rails 重新格式化json文件

Ruby on rails 重新格式化json文件,ruby-on-rails,json,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" }, task :import =&g

我有一个很大的json文件,其中的数据是这样垂直组织的

{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blha blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blahblah"
},
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
如果我尝试用这样的数据运行rake任务

{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blah blha blah"
},
{
  "id": "blah",
  "jurisdiction": "ny",
  "name": "blahblah"
},
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文件更改为正确的格式

更新

我把它们放在一条像这样的绳子里。当我运行rakeimport时,它将所有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的第二个循环!(法庭)
。我不确定问题出在后面的逗号

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

看起来您正在分别分析每一行。“{”不是一个完全有效的JSON字符串。请尝试将所有行连接到一个大字符串中,然后立即分析整个字符串。

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

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

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

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

我尝试了您的解决方案,但它抛出了一个错误。如果您有时间,请查看OP中的更新,并建议我如何修复它。感谢您的解释。那么您关于“有效的Ruby数据结构”的观点是否与我的原始json文件一样简单,而不是此处列出的类型之一?因此需要将其放入数组中?数组是必需的记住JSON格式。您的JSON文件包含一系列未命名的元素。这是一个数组。您可以通过在它们之间加逗号并将整个内容括在方括号中来表示JSON。@edPlunkett好的,谢谢,如果数组是有效的Ruby数据类型,为什么必须将其转换为字符串JSON是用于存储和存储的文本格式传输结构化信息。从文件中读取的JSON文本首先是一个字符串。您正在将其转换为字符串。假设您在服务器上有一个Ruby程序,需要将一些数据结构发送到另一个大陆上的客户端。它将Ruby数据结构转换为JSON格式的字符串,可以通过HTT发送P.是这样的。客户端解析字符串以重新创建原始数据结构。这就是JSON的用途。您所做的基本上就是该场景的客户端。非常感谢您的澄清。我没有想到JSON文件中的数据是字符串,因为文件以
.JSON
结尾,而内容没有以
包装