如何将Python列表序列化为JSON单行且保留字典缩进?
解决Python JSON序列化时字典缩进、列表单行的需求
当使用json.dumps(data, indent=4)序列化包含列表的字典时,列表会被拆分为多行显示,影响整体排版简洁性。要实现字典层级保留缩进、列表内容单行显示的效果,可以通过以下两种方式实现:
方法一:正则替换(简单场景适用)
先按正常缩进规则序列化整个结构,再用正则表达式将多行列表替换为单行。这种方式适合列表元素为数字、字符串等简单类型的场景。
示例代码:
import json import re def json_dumps_custom(data, indent=4): # 先生成带缩进的标准JSON字符串 raw_json = json.dumps(data, indent=indent) # 匹配多行列表的正则:捕获列表前的缩进,以及列表内的所有元素行 list_pattern = re.compile(r'(\s*)\[\n\s+([\d.,\s"-]+)\s*\]', re.DOTALL) def replace_multiline_list(match): # 获取列表前的缩进字符串 prefix_indent = match.group(1) # 提取列表元素,去掉换行和多余缩进,用逗号分隔 elements = match.group(2).strip().replace('\n' + ' '*(indent + len(prefix_indent)), ', ') return f'{prefix_indent}[{elements}]' return list_pattern.sub(replace_multiline_list, raw_json)
使用示例:
test_data = { "info": { "id": 1001, "type": "sensor" }, "data": [-6.15, -0.5, 0.54, 0.58, -4.63, 12.0] } print(json_dumps_custom(test_data))
输出效果:
{ "info": { "id": 1001, "type": "sensor" }, "data": [-6.15, -0.5, 0.54, 0.58, -4.63, 12.0] }
方法二:自定义JSON编码器(复杂场景适用)
如果列表中嵌套了其他结构,或者需要更精准的控制,可以继承json.JSONEncoder重写序列化逻辑,针对列表类型单独处理为单行,同时保留字典的缩进层级。
示例代码:
import json from json.encoder import encode_basestring_ascii class CustomJSONEncoder(json.JSONEncoder): def __init__(self, indent=4, **kwargs): super().__init__(indent=indent, **kwargs) self.indent = indent # 记录当前缩进层级 self.current_indent = 0 def encode(self, obj): if isinstance(obj, list): # 列表直接序列化为单行 return '[' + ', '.join(self.encode(item) for item in obj) + ']' elif isinstance(obj, dict): self.current_indent += self.indent # 字典按正常缩进处理 items = [] indent_str = ' ' * self.current_indent for key, value in obj.items(): key_str = encode_basestring_ascii(key) value_str = self.encode(value) items.append(f'{indent_str}{key_str}: {value_str}') self.current_indent -= self.indent return '{\n' + ',\n'.join(items) + '\n' + ' '*(self.current_indent) + '}' else: # 其他类型沿用默认序列化 return super().encode(obj)
使用时直接指定编码器:
print(json.dumps(test_data, cls=CustomJSONEncoder))
该方法能处理更复杂的嵌套结构,同时严格控制字典和列表的显示格式。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

