Python json.dumps输出ANSI转义符被转义为\u001b如何解决
问题成因
json.dumps 方法的 ensure_ascii=False 参数,仅作用于码点大于127的非ASCII字符(比如中文、多语言特殊符号),控制这类字符不被转义为\uXXXX格式。
你用来实现终端加粗的ANSI转义序列开头的\033是ESC控制符,ASCII码为27(对应Unicode码点U+001B),属于ASCII范围内的控制字符。按照JSON标准RFC 8259的要求,所有控制字符在序列化时必须被转义,因此不管ensure_ascii参数如何设置,这个字符都会被默认转义为\u001b。转义后的内容会被终端识别为普通文本,不会解析为样式控制指令,自然无法实现加粗效果。
解决方案
根据你的使用场景二选一即可:
方案1:仅需终端展示、不需要输出标准可解析JSON
自定义JSON编码器,序列化时把转义后的ESC字符还原为原始控制符即可,示例代码:import json class TerminalSafeEncoder(json.JSONEncoder): def iterencode(self, o, _one_shot=False): for chunk in super().iterencode(o, _one_shot=_one_shot): yield chunk.replace("\\u001b", "\033") # 打印时指定自定义编码器 print(json.dumps(data, indent=4, ensure_ascii=False, cls=TerminalSafeEncoder))注意:该方法生成的内容不符合严格JSON规范,仅可用于本地终端查看,不能传给其他依赖标准JSON格式的程序解析,否则会触发解析错误。
方案2:需要保留标准JSON输出兼容性
不要提前把ANSI转义码存入待序列化的字典。先调用json.dumps生成标准合规的JSON字符串,再针对你需要加粗的字段内容做文本匹配,给对应内容包裹ANSI加粗转义码后再打印。这种方式既不会破坏JSON的标准性,也能实现终端样式效果。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

