如何解析包含多个JSON对象的单行JSON文件并按行输出对象
解析单行多JSON对象的正确姿势
嘿,我完全懂你遇到的坑——用暴力匹配大括号的方法处理带嵌套结构的JSON简直是灾难!毕竟JSON里经常会有嵌套的对象(比如{"user": {"name": "Alice"}}),你直接找第一个}根本没法判断一个完整JSON的真正结束位置,这就是为啥你的程序每次结果都不一致的原因。
问题出在哪?
你写的逻辑是找第一个{和第一个}来截取字符串,但一旦遇到嵌套的JSON结构,这个截取就会提前终止,比如把{"user": {"name": "Alice"}当成一段去解析,触发ValueError后再往后找},但这种“试错”的方式非常不可靠,遇到多层嵌套或者复杂结构很容易乱套。
正确解法:用JSONDecoder的增量解析
Python的json模块其实自带了增量解析的能力,JSONDecoder.raw_decode()方法可以从字符串的指定位置开始,精准解析出第一个完整的JSON对象,同时返回下一个要解析的起始位置。用这个方法循环处理,就能完美解决单行多JSON的问题。
直接上代码:
import json def parse_multiple_json(input_str): decoder = json.JSONDecoder() current_pos = 0 str_length = len(input_str) while current_pos < str_length: try: # 解析出第一个完整的JSON对象,同时得到下一个起始位置 json_obj, current_pos = decoder.raw_decode(input_str, current_pos) yield json_obj except json.JSONDecodeError: # 跳过无效字符(比如空格、逗号、换行符等分隔符) current_pos += 1 # 读取输入文件并输出每行一个JSON对象 with open('sample.json', 'r') as infile, open('output.json', 'w') as outfile: content = infile.read() for obj in parse_multiple_json(content): # 将每个JSON对象转为字符串写入(也可以用json.dumps加indent美化) json.dump(obj, outfile) outfile.write('\n')
这个方法的优势:
- 精准处理嵌套:不管JSON里有多少层嵌套对象或数组,
raw_decode都能准确识别完整的JSON边界。 - 容错性强:如果多个JSON对象之间有空格、逗号之类的分隔符,代码里的异常处理会自动跳过这些无效字符,继续解析下一个对象。
- 效率更高:不需要反复截取字符串和试错,一次解析到位。
适配你的原有写入逻辑
如果你想保留自己的writeToFilee函数,只需要把循环部分改成:
with open('sample.json') as inp: s = inp.read() for x in parse_multiple_json(s): writeToFilee(x)
这样就能稳定输出每行一个JSON对象啦!
内容的提问来源于stack exchange,提问作者Faber




