在Python 2.7中,如果我编码JSON,我会得到unicode转义字符串:
>>> import json
>>> s = {"text": "三杯雞"}
>>> print(json.dumps(s))
它给出了这个输出:
{"text": "\u4e09\u676f\u96de"}
但在Go中,类似的代码:
package main
import (
"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"}
答案 0 :(得分:2)
一种解决方案是在自定义JSON封送程序中使用strconv.QuoteToASCII
方法:
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中一样。