登录
首页 >  Golang >  Go问答

从 json.Unmarshal 得到错误“无效字符 '茂' 寻找值的开头”

来源:Golang技术栈

时间:2023-04-24 18:23:17 200浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《从 json.Unmarshal 得到错误“无效字符 '茂' 寻找值的开头”》就很适合你!本篇内容主要包括从 json.Unmarshal 得到错误“无效字符 '茂' 寻找值的开头”,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我使用 Golang HTTP 请求来获取 json 输出,如下所示。我试图访问的网络服务是 Micrsoft Translator [https://msdn.microsoft.com/en- us/library/dn876735.aspx](https://msdn.microsoft.com/en- us/library/dn876735.aspx)

//Data struct of TransformTextResponse
type TransformTextResponse struct {
    ErrorCondition   int    `json:"ec"`       // A positive number representing an error condition
    ErrorDescriptive string `json:"em"`       // A descriptive error message
    Sentence         string `json:"sentence"` // transformed text
}


//some code ....
body, err := ioutil.ReadAll(response.Body)
defer response.Body.Close()
if err != nil {
    return "", tracerr.Wrap(err)
}

transTransform = TransformTextResponse{}
err = json.Unmarshal(body, &transTransform)
if err != nil {
   return "", tracerr.Wrap(err)
}

我收到了一个错误invalid character '茂' looking for beginning of value

所以,我尝试打印bodyas string fmt.Println(string(body)),它显示:

{"ec":0,"em":"OK","sentence":"This is too strange i just want to go home soon"}

看起来数据没有任何问题,所以我尝试通过创建相同的值jason.Marshal

transTransform := TransformTextResponse{}
transTransform.ErrorCondition = 0
transTransform.ErrorDescriptive = "OK"
transTransform.Sentence = "This is too strange i just want to go home soon"
jbody, _ := json.Marshal(transTransform)

我发现原始数据可能有问题,所以我尝试比较两个数据的[]byte格式。

数据来自response.Body

[239 187 191 123 34 101 99 34 58 48 44 34 101 109 34 58 34 79 75 34 44 34 115 101 110 116 101 110 99 101 34 58 34 84 104 105 115 32 105 115 32 116 111 111 32 115 116 114 97 110 103 101 32 105 32 106 117 115 116 32 119 97 110 116 32 116 111 32 103 111 32 104 111 109 101 32 115 111 111 110 34 125]

数据来自json.Marshal

[123 34 101 99 34 58 48 44 34 101 109 34 58 34 79 75 34 44 34 115 101 110 116 101 110 99 101 34 58 34 84 104 105 115 32 105 115 32 116 111 111 32 115 116 114 97 110 103 101 32 105 32 106 117 115 116 32 119 97 110 116 32 116 111 32 103 111 32 104 111 109 101 32 115 111 111 110 34 125]

知道我如何解析它response.Body并将其解组为数据结构吗?

正确答案

服务器正在向您发送一个带有字节顺序标记 (BOM)的 UTF-8 文本字符串。BOM 标识文本是 UTF-8 编码的,但应在解码前将其删除。

这可以通过以下行来完成(使用包 "bytes"):

body = bytes.TrimPrefix(body, []byte("\xef\xbb\xbf")) // Or []byte{239, 187, 191}

PS。所指的错误是因为解释为 ISO-8859-1 字符串的 UTF-8 BOM 将产生字符茂禄驴

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>