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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:30:52