【问题标题】:Got error "invalid character 'ï' looking for beginning of value” from json.Unmarshal从 json.Unmarshal 得到错误“无效字符 'ï' 寻找值的开头”
【发布时间】:2015-07-14 05:06:12
【问题描述】:

我使用 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 'ï' looking for beginning of value 的错误

所以,我尝试将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 并将其解组为数据结构吗?

【问题讨论】:

  • 前三个字节是 UTF-8 的 BOM (239 187 191)。让服务器包含 UTF-8 BOM 或丢弃前 3 个字节,然后再处理其余部分(这是实际的 UTF-8 编码字符串)。
  • 在将请求正文绑定到模型时,我收到了类似的错误消息:“无效字符...正在寻找值的开头”。在我的情况下,错误是客户端:请求有效负载数据是使用错误的内容类型(不是 json)发送的。

标签: json go


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,但不确定为什么 Microsoft 网站会使用额外的 BOM 标识符进行响应。
  • @EvanLin 欢迎 :) 。这是奇怪的行为。 JSON 规范 (RFC7159) 明确指出“实现不得添加字节顺序标记”。但它也表示解码实现“可能会忽略字节顺序标记的存在,而不是将其视为错误”,因此将其删除是可以的。
  • @EvanLin "Microsoft",这就是原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2022-10-24
  • 2022-07-20
相关资源
最近更新 更多