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

