为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
波斯汪 2022-01-10 17:12:45
在 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 中一样。


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 362 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信