Python3.6 API输出JSON时如何生成无双反斜杠的Unicode字符串
首先咱们理清问题根源:你当前代码里的b"\u003chead\u003e"写法是错误的——\uXXXX是字符串(str)专属的Unicode转义序列,不能直接用在字节串(bytes)里。当你这么写时,Python会先把\u003c解析成字符<,再编码成字节串,所以b"\u003chead\u003e".decode('utf-8')实际得到的就是普通字符串<head>,后续json.dumps的行为可能让你产生了误解。
你看到的\\u003chead\\u003e其实是Python对JSON字符串的打印显示形式(Python会自动转义反斜杠方便你查看),而非实际输出的JSON内容。如果把这个JSON字符串写入文件或发送给Android应用,接收方看到的会是\u003chead\u003e(单反斜杠),这完全符合JSON标准,解析后就是<head>字符。
不过如果你确实想要让json.dumps直接输出\u003c这类转义形式,或者彻底避免双反斜杠的显示,这里有两种靠谱的解决方案:
方案1:修正字符串创建方式,直接使用实际字符
如果你最终需要的是<head>这个Unicode字符串,直接用普通字符串赋值即可,json.dumps默认会正确处理:
import json abc = {"me": "<head>"} result = json.dumps(abc) print(result) # 输出: {"me": "<head>"}
如果你的原始数据确实是字节串,用正确的字节串写法:
# 直接写入可见字符的字节串 abc = {"me": b'<head>'.decode('utf-8')} # 或者用十六进制转义的字节串 abc = {"me": b'\x3chead\x3e'.decode('utf-8')}
方案2:强制JSON输出Unicode转义形式
如果你需要JSON中明确显示\u003c这类转义(而非直接的<),可以自定义一个JSON编码器,重写字符串的编码逻辑:
import json class UnicodeEscapeEncoder(json.JSONEncoder): def encode(self, obj): # 先调用默认编码得到基础字符串 encoded = super().encode(obj) # 将<和>替换为对应的Unicode转义序列 encoded = encoded.replace('<', r'\u003c').replace('>', r'\u003e') return encoded abc = {"me": "<head>"} result = json.dumps(abc, cls=UnicodeEscapeEncoder) print(result) # 输出: {"me": "\u003chead\u003e"}
注意:Python打印时可能还是会显示\\u003c,但实际字符串内容是单反斜杠。你可以通过写入文件验证:
with open('output.json', 'w', encoding='utf-8') as f: f.write(result)
打开output.json文件,就能看到正确的\u003chead\u003e,没有多余的双反斜杠。
内容的提问来源于stack exchange,提问作者mambo

