我有数千个包含多个JSON对象的文本文件,但不幸的是,对象之间没有分隔符。
对象以字典的形式存储,它们的一些字段本身就是对象。每个对象可能有不同数量的嵌套对象。具体地说,一个对象可能如下所示:
{field1: {}, field2: "some value", field3: {}, ...}
并且数百个这样的对象在文本文件中没有分隔符地连接在一起。这意味着我既不能使用json.load()
,也不能使用json.loads()
。
有什么建议可以解决这个问题吗?有没有已知的解析器可以解决这个问题?
9条答案
按热度按时间dfddblmv1#
这将从字符串中解码JSON对象的“列表”:
这里的好处是你可以很好地使用解析器,因此它会不断地告诉你它在哪里发现了错误。
示例
清洗液(后补)
示例
afdcj2ne2#
溶液
据我所知,
}{
不会出现在有效的JSON中,所以当试图为连接的单独对象获取字符串时,下面的内容应该是完全安全的(txt
是文件的内容)。它不需要任何导入(即使是re
模块)来做到这一点:或者如果你更喜欢列表解析(正如大卫Zwicker在评论中提到的),你可以这样使用它:
这将导致
retrieved_strings
是一个字符串列表,每个字符串包含单独的JSON对象。请参见这里的证明:http://ideone.com/Purpb示例
以下字符串:
会变成:
如在the example I mentioned中证明的。
qlvxas9a3#
Sebastian Blask's answer的想法是正确的,但是没有理由使用正则表达式来进行如此简单的更改。
或者更清楚地说
f4t66c6m4#
不如这样:
3phpmpom5#
你可以把文件作为一个字符串加载,用
},{
替换所有的}{
,然后用[]
包围整个文件。比如:
如果您确定始终使用
}{
,而中间没有空格,则可以使用简单的字符串替换。如果你希望
}{
也出现在字符串中,你也可以在}{
上进行分割,并用json.load
计算每个片段,如果你得到一个错误,这个片段不完整,你必须将下一个添加到第一个片段上,依此类推。bvn4nwqk6#
如何阅读文件,每次找到{时递增计数器,遇到}时递减计数器。当计数器达到0时,您将知道您已经到达第一个对象的末尾,因此通过json.load发送它并重新开始计数。然后重复完成。
33qvvth17#
bxpogfeg8#
假设你在一个文件中的文本开头添加了一个[,并使用了一个版本的json.load(),当它检测到错误时,找到了一个{而不是预期的逗号(或命中文件的结尾),吐出刚刚完成的对象?
idfiyjo89#
用垃圾文件替换文件:
在Python中动态执行: