如何解析包含多个对象的单行json文件

时间:2019-04-09 12:46:23

标签: python json python-3.x

我需要读取一些JSON数据进行处理。我有一个包含多个JSON对象的线文件,该如何解析呢?

我希望输出为每个对象一行的文件。

我尝试了一种蛮力方法,该方法将递归使用json.loads来检查json是否有效,但是每次运行程序时都会得到不同的结果

import json

with open('sample.json') as inp:
s = inp.read()

jsons = []

start, end = s.find('{'), s.find('}')
while True:
 try:
    jsons.append(json.loads(s[start:end + 1]))
    print(jsons)
except ValueError:
    end = end + 1 + s[end + 1:].find('}')
else:
    s = s[end + 1:]
    if not s:
        break
    start, end = s.find('{'), s.find('}')

for x  in jsons:
  writeToFilee(x)

可以在这里看到json格式 https://pastebin.com/DgbyjAG9

3 个答案:

答案 0 :(得分:1)

为什么不仅仅使用JSONDecodeErrorpos属性来告诉您在何处划界呢?

类似:

import json

def json_load_all(buf):
    while True:
        try:
            yield json.loads(buf)
        except json.JSONDecodeError as err:
            yield json.loads(buf[:err.pos])
            buf = buf[err.pos:]
        else:
            break

以如下方式使用您的演示数据:

with open('data.json') as fd:
    arr = list(json_load_all(fd.read()))

正好给了我两个要素,但我想您还有更多?

要使用标准库完成此操作,写出内容类似于:

with open('data.json') as inp, open('out.json', 'w') as out:
    for obj in json_load_all(inp.read()):
        json.dump(obj, out)
        print(file=out)

否则,jsonlines软件包非常适合处理这种数据格式

答案 1 :(得分:1)

以下代码对我有用:

import json
with open(input_file_path) as f_in: 
    file_data = f_in.read() 
    file_data = file_data.replace("}{", "},{") 
    file_data = "[" + file_data + "]"
    data = json.loads(file_data)

答案 2 :(得分:0)

@Chris A的评论之后,我准备了此片段,该片段应该可以正常工作:

with open('my_jsons.file') as file:
    json_string = file.read()

json_objects = re.sub('}\s*{', '}|!|{', json_string).split('|!|')
# replace |!| with whatever suits you best

for json_object in json_objects:
    print(json.loads(obj))

但是,一旦} {“字符串出现在JSON中的某个值中,此示例将一文不值,因此我强烈建议使用@Sam Mason的解决方案