我使用Golang HTTP请求获取json输出,如下所示。我尝试访问的Web服务是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
invalid character 'ï' looking for beginning of value
因此,我尝试打印bodyas字符串fmt.Println(string(body)),它显示:
body
fmt.Println(string(body))
{"ec":0,"em":"OK","sentence":"This is too strange i just want to go home soon"}
看来数据没有任何问题,所以我尝试通过创建相同的值 jason.Marshal
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格式的数据。
[]byte
来自的数据response.Body:
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
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。引用该错误ï是因为将UTF-8 BOM解释为ISO-8859-1字符串会产生这些字符。
ï