You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的json.dump()的default参数自定义JSON格式化?

实现自定义JSON数组格式化输出

要实现每个对象单独一行、对象间空一行的JSON格式,json.dump()的default参数并不适用——它的作用是处理无法被JSON原生序列化的对象,而非控制输出格式。我们可以通过手动拼接序列化内容或自定义JSON编码器两种方式达成需求:

方法一:手动拼接序列化内容(直观易控制)

直接对数组中的每个对象单独序列化,再按照目标格式拼接成完整的JSON字符串写入文件:

import json

example = [{"a":1, "b":2, "c":3}, {"d":1, "e":2, "f":3}, {"g":1, "h":2, "i":3}, {"j":6, "k":7, "l":8}]

with open('output.json', 'w', encoding='utf-8') as f:
    # 写入数组开头
    f.write('[\n')
    for idx, obj in enumerate(example):
        # 单个对象序列化为紧凑的一行
        obj_json = json.dumps(obj)
        # 写入带缩进的对象行
        f.write(f'    {obj_json}')
        # 处理分隔符:非最后一个对象末尾加逗号+空行,最后一个只加换行
        if idx != len(example) - 1:
            f.write(',\n\n')
        else:
            f.write('\n')
    # 写入数组结尾
    f.write(']')

方法二:自定义JSON编码器(符合模块规范,可复用)

通过继承json.JSONEncoder重写encode方法,定制数组的输出格式:

import json

class CustomArrayEncoder(json.JSONEncoder):
    def encode(self, obj):
        if isinstance(obj, list):
            # 序列化数组内每个元素为紧凑格式
            serialized_items = [f'    {super().encode(item)}' for item in obj]
            # 用逗号+换行+空行连接元素,包裹成合法数组
            return '[\n' + ',\n\n'.join(serialized_items) + '\n]'
        # 非数组类型按默认规则序列化
        return super().encode(obj)

example = [{"a":1, "b":2, "c":3}, {"d":1, "e":2, "f":3}, {"g":1, "h":2, "i":3}, {"j":6, "k":7, "l":8}]

with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(example, f, cls=CustomArrayEncoder)

针对持续写入场景的补充

如果需要追加写入到已有JSON文件(数组持续增长),需注意维护JSON格式的合法性:

  • 首次写入时完成数组开头[的写入;
  • 后续追加对象前,先读取文件末尾(去掉原本的]),再写入,\n\n {obj_json},最后重新写入];
  • 或采用临时文件中转的方式,读取原有数组、追加新对象后重新写入完整内容(适合对象数量不是极大的场景)。

内容的提问来源于stack exchange,提问作者prainbow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:14:54