从json.Unmarshal收到错误"无效字符'ï'寻找值的开头"

Eva*_*Lin 9 json go

我使用Golang HTTP请求获取json输出如下.我试图访问的网络服务是Micrsoft Translator 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

{"ec":0,"em":"OK","sentence":"This is too strange i just want to go home soon"}
Run Code Online (Sandbox Code Playgroud)

似乎数据没有任何问题,所以我试图通过创建相同的值 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)
Run Code Online (Sandbox Code Playgroud)

我发现原始数据可能有问题,所以我尝试比较两种[]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]
Run Code Online (Sandbox Code Playgroud)

来自的数据 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]
Run Code Online (Sandbox Code Playgroud)

知道如何解析这个response.Body并将其解组成数据结构吗?

ANi*_*sus 21

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

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

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

PS.引用的错误ï是因为UTF-8 BOM被解释为ISO-8859-1字符串将产生字符.

  • @EvanLin"微软",这就是原因. (7认同)
  • @EvanLin欢迎:).这是奇怪的行为.JSON规范(RFC7159)明确声明"实现绝不能添加字节顺序标记".但它也说解码实现"可以忽略字节顺序标记的存在,而不是将其视为错误",所以修剪它是可以的. (3认同)
  • 谢谢,但不确定为什么 Microsoft 网站会使用额外的 BOM 标识符进行响应。 (2认同)