在 Python 2.7 中,如果我对 JSON 进行编码,我会得到 unicode 转义的字符串:>>> import json>>> s = {"text": "三杯雞"}>>> print(json.dumps(s))它给出了这个输出:{"text": "\u4e09\u676f\u96de"}但是在 Go 中,类似的代码:package mainimport ( "encoding/json" "fmt")type Food struct { Name string `json:"name"`}func main() { food := Food{Name: "三杯雞"} v, _ := json.Marshal(food) fmt.Println(string(v))}给出了这个:{"name":"三杯雞"}汉字没有转义。我正在将 API 端点从 Python 移植到 Go - 如何让它具有与 Python 相同的转义输出?我尝试使用变体strconv.QuoteToASCII,但它们导致 unicode 被双重转义:func main() { s := strconv.QuoteToASCII("三杯雞") s = strings.Trim(s, "\"") food := Food{Name: s} v, _ := json.Marshal(food) fmt.Println(string(v))}输出:{"name":"\\u4e09\\u676f\\u96de"}
1 回答
蛊毒传说
TA贡献1895条经验 获得超3个赞
一种解决方案是使用strconv.QuoteToASCII自定义 JSON 封送拆收器内部的方法:
package main
import (
"encoding/json"
"fmt"
"strconv"
)
type Food struct {
Name utf8String `json:"name"`
}
type utf8String string
func (s utf8String) MarshalJSON() ([]byte, error) {
return []byte(strconv.QuoteToASCII(string(s))), nil
}
func main() {
food := Food{Name: utf8String("三杯雞")}
v, _ := json.Marshal(food)
fmt.Println(string(v))
}
输出:
{"name":"\u4e09\u676f\u96de"}
这样做的缺点是您不能string在结构定义中使用普通类型,但最终输出是 ASCII 引用的,就像在 Python 中一样。
- 1 回答
- 0 关注
- 362 浏览
添加回答
举报
0/150
提交
取消