【问题标题】:Read multiple concatenated json objects in Ruby在 Ruby 中读取多个连接的 json 对象
【发布时间】:2019-10-03 09:57:30
【问题描述】:

我有一个文件包含多个不以逗号分隔的 JSON 对象:

{
  "field" : "value",
  "another_field": "another_value"
} // no comma
{ 
  "field" : "value"
}

每个独立的对象都是一个有效的 json 对象。

有什么方法可以让我轻松处理这个文件?

  1. 我知道这不是一个有效的 json,但不幸的是,这个文件是由第 3 方工具生成的。我无法更改输出的外观。
  2. 我无法在运行前打开文本编辑器和智能插入逗号/方括号,因为这是一个自动化过程(我也真的不想编写打开文件并对其进行操作的代码)。

在 .NET 中有一个库具有这个确切的功能: https://stackoverflow.com/a/29480032/2970729 https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonReader_SupportMultipleContent.htm

在 Ruby 中有什么等价的吗?

【问题讨论】:

  • "我无法在运行前打开文本编辑器和智能插入逗号/方括号" -- 您无需打开文本编辑器即可编辑一份文件!为什么不在文件上运行sed
  • 是文件中的嵌套哈希还是可以假设在每个} 之后添加, 会向前迈出一大步吗?
  • @TomLord 不知道这个命令,现在正在研究它。实际上我可以选择在处理之前运行 bash 命令,这样它可能会为我的问题提供适当的解决方案,但仍然想知道是否有 ruby​​ 解决方案
  • @spickermann 我的对象不复杂且不包含嵌套对象(目前...)

标签: ruby-on-rails json ruby


【解决方案1】:

只要您的文件如此简单,您可能想要执行以下操作:

# content = File.read(filename)
content =<<-EOF
  {
    "field" : "value",
    "another_field": "another_value"
  } // no comma
  { 
    "field" : "value"
  }
EOF

require 'json'

JSON.parse("[#{content.gsub(/\}.*?\{/m, '},{')}]")
#=> [{"field"=>"value", "another_field"=>"another_value"}, {"field"=>"value"}]

【讨论】:

  • 按预期工作 :) 非常感谢!
【解决方案2】:

yajl-ruby gem 可以在 Ruby 中处理串联的 JSON。解析器可以从字符串或 IO 中读取。每个完整的对象都会产生一个块。

require 'yajl'

File.open 'file.json' do |f|
  Yajl.load f do |object|
    # do something with object
  end
end

请参阅documentation 了解其他选项(缓冲区大小、符号化键等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多