在Ruby中读取多个串联的json对象

im9ewurl  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(100)

我有一个包含多个JSON对象的文件,这些对象没有用逗号分隔:

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

字符串
每个独立对象都是有效的json对象。

有没有什么方法可以轻松处理此文件?

1.我知道这不是一个有效的JSON,但不幸的是,这个文件是由第三方工具生成的。我没有选择改变输出的方式。
1.我不能在运行之前打开文本编辑器并智能插入逗号/方括号,因为这是一个自动化的过程(我也不想编写打开文件并操作它的代码)。
在.NET中,有一个库具有此确切功能:https://stackoverflow.com/a/29480032/2970729https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonReader_SupportMultipleContent.htm
在Ruby中有什么等价物吗?

8fq7wneg

8fq7wneg1#

只要你的文件是那么简单,你可能想做这样的事情:

# 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"}]

字符串

izj3ouym

izj3ouym2#

yajl-ruby gem支持在Ruby中处理串联的JSON。解析器可以从String或IO读取数据。每个完整的对象被生成一个块。

require 'yajl'

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

字符串
有关其他选项(缓冲区大小、符号化密钥等),请参见documentation

sshcrbum

sshcrbum3#

如果您知道数据将是有效的JSON文档,则可以使用此方法将字符串拆分为文档,然后解析每个文档。

def split_documents(str)
  res = []
  depth = 0
  start = 0
  str.scan(/([{}]|"(?:\\"|[^"])*")/) do |match|
    if match[0] == '{'
      depth += 1
    elsif match[0] == '}'
      depth -= 1
      if depth == 0
        match_start = Regexp.last_match.begin(0)
        res << str[start..match_start]
        start = match_start + 1
      end
    end
  end
  res
end

字符串
这将扫描字符串中的{}或字符串。每次它命中{,它将深度增加1。每次它击中},深度减少1。每次深度为零时,您就知道已经到达了文档的末尾,因为您有平衡大括号。正则表达式还必须匹配字符串,这样它就不会意外地计算字符串中的大括号,例如。{ "foo": "ba}r" }的值。

相关问题