转义Go JSON中的unicode字符,使输出与Python匹配

时间:2016-05-18 15:34:00

标签: json go unicode

在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"}

1 个答案:

答案 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中一样。