Ruby on rails 重新格式化json文件
我有一个很大的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
{
"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
结尾,而内容没有以包装代码>。