我有一个大的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
答案 0 :(得分:2)
您有几个问题,尤其是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字符串。尝试将所有行连接成一个大字符串并立即解析整个字符串。