如何用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
相关产品推荐
相关产品推荐

