从json得到错误“无效的字符'ï'寻找值的开头". [英] Got error "invalid character 'ï' looking for beginning of value” from json.Unmarshal

查看:108
本文介绍了从json得到错误“无效的字符'ï'寻找值的开头".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Golang HTTP请求获取json输出,如下所示. 我尝试访问的Web服务是Micrsoft Translator https://msdn.microsoft. com/en-us/library/dn876735.aspx

I use a Golang HTTP request to get json output as follow. The web service I am trying to access is 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)
}

我收到了来自invalid character 'ï' looking for beginning of value

因此,我尝试将body打印为字符串fmt.Println(string(body)),它显示为:

So, I try to print the body as string fmt.Println(string(body)), it show:

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

似乎数据没有任何问题,所以我尝试通过jason.Marshal

It seems the data doesn't have any problem, so I tried to create the same value by 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格式比较两个数据.

I found the original data might have problem, so I try to compare two data in []byte format.

来自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并将其解组为数据结构吗?

Any idea how I parse this response.Body and Unmarshal it into data structure?

推荐答案

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

The server is sending you a UTF-8 text string with a Byte Order Mark (BOM). The BOM identifies that the text is UTF-8 encoded, but it should be removed before decoding.

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

This can be done with the following line (using package "bytes"):

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

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

PS. The error referring to ï is because the UTF-8 BOM interpreted as an ISO-8859-1 string will produce the characters .

这篇关于从json得到错误“无效的字符'ï'寻找值的开头".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆