在 Go JSON 中转义 unicode 字符,以便输出与 Python 匹配

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


波斯汪
浏览 363回答 1
1回答

蛊毒传说

一种解决方案是使用strconv.QuoteToASCII自定义 JSON 封送拆收器内部的方法:package mainimport (    "encoding/json"    "fmt"    "strconv")type Food struct {    Name utf8String `json:"name"`}type utf8String stringfunc (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 中一样。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go