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

如何在Python中按键选择性美化JSON?

如何在Python中选择性美化JSON(指定字段压缩为单行)

这个需求很实用——既想让整个JSON保持清晰的美化格式,又要把特定键(比如你例子里的DATE)对应的字典压缩成单行节省空间。Python标准库的json模块本身没有直接提供这种混合格式化的选项,但我们可以通过简单的组合操作实现这个效果,下面分享两种可行的方案:

方案一:正则替换(适合简单场景)

如果你的DATE字段对应的子结构是简单字典(没有多层嵌套),用正则表达式替换是最快的方法。思路是先生成整体美化的JSON,再把DATE对应的块替换成压缩后的版本:

import json
import re

# 原始数据
data = {
    "String_entered": "string",
    "DATE": {
        "year": 2013,
        "month": None,
        "day": None
    }
}

# 1. 生成整体美化的JSON字符串
pretty_json = json.dumps(data, indent=2)

# 2. 生成DATE字段对应的压缩版字符串
compressed_date = json.dumps(data["DATE"], indent=None, separators=(',', ':'))

# 3. 用正则替换DATE部分的美化内容为压缩版
# 正则匹配"DATE": 后面的所有内容直到对应闭合的}(支持多行)
pattern = re.compile(r'"DATE":\s*{[^}]*}', re.DOTALL)
final_json = pattern.sub(f'"DATE": {compressed_date}', pretty_json)

print(final_json)

运行后输出的结果就是你想要的:

{
  "String_entered": "string",
  "DATE": {"year":2013,"month":null,"day":null}
}

注意:如果DATE的子字典有多层嵌套(比如里面还有子字典),正则可能会匹配错误的闭合},这种情况建议用下面的方案。

方案二:自定义序列化处理(更健壮)

如果你的JSON结构比较复杂,DATE字段有多层嵌套,我们可以先解析JSON为Python对象,然后对指定字段单独处理,再手动拼接成最终的JSON字符串。这种方法更可靠:

import json
import re

def selective_pretty_print(data, indent=2, compact_keys=None):
    compact_keys = compact_keys or []
    # 先把非指定字段的内容正常美化
    pretty_data = json.dumps(data, indent=indent)
    
    def replace_compact_keys(obj):
        nonlocal pretty_data
        if isinstance(obj, dict):
            for key, value in obj.items():
                if key in compact_keys:
                    # 把当前值压缩成单行
                    compact_val = json.dumps(value, indent=None, separators=(',', ':'))
                    # 匹配该键对应的美化后值,替换为压缩版
                    pretty_val = json.dumps(value, indent=indent)
                    key_pattern = re.compile(rf'"{re.escape(key)}":\s*{re.escape(pretty_val)}', re.DOTALL)
                    pretty_data = key_pattern.sub(f'"{key}": {compact_val}', pretty_data)
                else:
                    replace_compact_keys(value)
    
    # 解析美化后的JSON,递归处理指定键
    parsed_data = json.loads(pretty_data)
    replace_compact_keys(parsed_data)
    return pretty_data

# 使用示例(包含嵌套结构的DATE字段)
data = {
    "String_entered": "string",
    "DATE": {
        "year": 2013,
        "month": None,
        "day": None,
        "details": {"hour": 10, "minute": 30}
    }
}

result = selective_pretty_print(data, compact_keys=["DATE"])
print(result)

这个方法会递归检查所有键,把指定的compact_keys对应的字段值替换为压缩版,即使有多层嵌套也能正确处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:34:22