json - 从 json.Unmarshal 得到错误 "invalid character ' ï' looking for beginning of value”

标签 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)
}

我收到一个错误,来自 invalid character 'ï' 寻找值的开头

所以,我尝试将 body 打印为字符串 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 并将其解码为数据结构吗?

最佳答案

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

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

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

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

关于json - 从 json.Unmarshal 得到错误 "invalid character ' ï' looking for beginning of value”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31398044/

相关文章:

python - Python 中 JSON 数据的问题

jquery - 最佳实践 - 从 Web 服务抛出异常

java - Horizo​​ntalScrollView从服务器获取数据

pointers - golang 中的 Null 与 nil?

json - 1 个接口(interface),2 个包,相同的结构变量名称但不同的 json 命名约定

go - 使用通配符匹配删除 s3 中的对象

java - Get 方法返回 XML 和 JSON

javascript - Ajax Get请求找不到JSON文件

go - 无法从 CPU 分析中获取数据

协程超时