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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:40:23