You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解析包含多个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

火山引擎 最新活动