
Go 中接收的 JSON 响应若含 uXXXX 形式的 Unicode 转义序列,直接打印会显示为原始转义码;需通过 json.Unmarshal 自动解码,或用 strconv.Unquote 手动解包带引号的转义字符串。
go 中接收的 json 响应若含 `uxxxx` 形式的 unicode 转义序列,直接打印会显示为原始转义码;需通过 `json.unmarshal` 自动解码,或用 `strconv.unquote` 手动解包带引号的转义字符串。
在使用 net/http 调用 Web API 时,服务器返回的 JSON 响应体中常包含以 uXXXX 格式编码的 Unicode 字符(如 "u5408u80a5" 表示中文“合肥”)。这类字符串是标准 JSON 的合法转义表示,并非乱码或编码错误——但若直接读取响应体并以 string 形式输出(尤其是未经 JSON 解析),Go 会原样打印转义序列,导致内容不可读。
根本原因在于:JSON 规范要求字符串中的 Unicode 字符必须以 u 四位十六进制形式转义,而 Go 的 encoding/json 包在反序列化时会自动将其还原为 UTF-8 字符串;但若跳过解析、仅作字节流读取(如用 bufio.Scanner 按 rune 扫描),则无法触发该解码逻辑,结果仍是原始转义文本。
✅ 正确做法是:始终优先使用 json.Unmarshal 解析响应体。它不仅能安全处理 Unicode 转义,还能校验 JSON 结构、类型转换、空值处理等:
func (c ClientInfo) Request(method string, url string, form url.Values) (map[string]interface{}, error) {
req, err := http.NewRequest(method, url, strings.NewReader(c.Encode(form)))
if err != nil {
return nil, err
}
req.Header = c.Header
req.AddCookie(&c.Cookie)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
// 读取完整响应体(注意:确保 Content-Length 合理,避免 OOM)
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var result map[string]interface{}
if err := json.Unmarshal(body, &result); err != nil {
return nil, fmt.Errorf("failed to unmarshal JSON: %w", err)
}
// 此时 result 中所有字符串字段(如 name、class_name)均已自动解码为可读中文
fmt.Printf("Forum name: %s
", result["forum"].(map[string]interface{})["name"])
return result, nil
}
⚠️ 注意事项:
-
不要手动扫描或拼接 JSON 字符串:
bufio.ScanRunes会破坏 JSON 的结构边界(如引号、嵌套括号),且无法识别转义上下文,极易出错。 -
务必检查
resp.Body是否关闭:原代码中defer resp.Body.Close()在函数开头执行,但此时resp可能为nil(请求失败时),应移至resp != nil分支内,或改用if resp != nil { defer resp.Body.Close() }。 -
若只需解码单个转义字符串片段(如从日志或非标准响应中提取),可用
strconv.Unquote,但注意其输入必须是带双引号的字符串字面量(如"u7d20u672au8c0b"),否则会报错:
s := `"\u7d20\u672a\u8c0b"` // 注意:网络响应中实际是 "\u..."(两个反斜杠),需先转为 "" + "u..." 再加引号
unquoted, err := strconv.Unquote(s)
if err != nil {
log.Fatal(err)
}
fmt.Println(unquoted) // 输出:素未谋
? 总结:处理 JSON 中的 Unicode,信任 encoding/json —— 它是 Go 官方为 JSON 语义定制的健壮解析器,自动完成字符解码、类型映射与错误恢复。绕过它而尝试“手动解转义”,不仅冗余,更易引入安全与兼容性风险。











