Python递归字典转JSON时如何选择性部分键值对单行输出?
在Python中实现JSON的选择性单行输出
原生json模块没有直接支持选择性单行格式化的参数,我们可以通过「先格式化再替换」或「自定义编码器」的方式实现需求,让指定键值对单行显示,其余保持换行格式化。
方法1:先格式化再替换目标键内容
先生成标准的缩进格式化JSON字符串,再通过字符串处理将指定键对应的多行内容替换为单行。
举个实际示例:
假设我们希望递归字典中的"meta"键内容单行显示,其余键保持换行:
import json import re data = { "name": "example_project", "config": { "debug": True, "timeout": 30 }, "meta": {"id": 456, "tags": ["python", "json"], "status": "active"} } # 先生成带缩进的格式化JSON formatted_json = json.dumps(data, indent=4) def collapse_key_to_single_line(json_str, target_key): # 正则匹配目标键对应的多行值块 pattern = re.compile( rf'("{target_key}":\s*){{\s*(.*?)\s*}}', re.DOTALL ) def replace_match(match): key_prefix = match.group(1) # 移除值部分的换行和多余缩进 cleaned_value = match.group(2).replace('\n', '').replace(' ', ' ') return f'{key_prefix}{{{cleaned_value}}}' return pattern.sub(replace_match, json_str) # 处理指定键,转为单行 final_json = collapse_key_to_single_line(formatted_json, "meta") print(final_json)
输出效果:
{ "name": "example_project", "config": { "debug": true, "timeout": 30 }, "meta": {"id": 456, "tags": ["python", "json"], "status": "active"} }
方法2:自定义JSON编码器封装逻辑
如果需要多次复用该功能,可以自定义编码器,把替换逻辑封装进去,支持批量指定单行键:
class SelectiveSingleLineEncoder(json.JSONEncoder): def __init__(self, indent=4, single_line_keys=None, **kwargs): super().__init__(indent=indent, **kwargs) self.single_line_keys = single_line_keys or [] def encode(self, obj): # 先调用父类生成标准格式化JSON encoded_str = super().encode(obj) # 批量处理所有指定键 for key in self.single_line_keys: encoded_str = collapse_key_to_single_line(encoded_str, key) return encoded_str # 使用自定义编码器,同时将"meta"和"config"转为单行 print(json.dumps(data, cls=SelectiveSingleLineEncoder, single_line_keys=["meta", "config"]))
注意事项
- 若目标键的值包含复杂嵌套或特殊字符,需要调整正则表达式,避免破坏JSON结构;
- Python 3.7+字典是有序的,若存在重复键会被覆盖,此方法会处理所有匹配到的键;
- 若要处理数组中的对象,需修改正则或字符串处理逻辑适配数组场景。
内容的提问来源于stack exchange,提问作者GSL
相关产品推荐
相关产品推荐

