Golang 无效字符'b'寻找值的开头

新手上路,请多包涵

我正在尝试在其中发布带有 xml 消息的 json。但是它返回:

 invalid character 'b' looking for beginning of value

我认为可能的原因是我正在尝试编组不是 json 格式的返回正文。

 func (s *BackendConfiguration) Do(req *http.Request, v interface{}) error {
    log.Printf("Requesting %v %v%v\n", req.Method, req.URL.Host, req.URL.Path)
    start := time.Now()

    res, err := s.HTTPClient.Do(req)

    if debug {
        log.Printf("Completed in %v\n", time.Since(start))
    }

    if err != nil {
        log.Printf("Request to sakura failed: %v\n", err)
        return err
    }
    defer res.Body.Close()

    resBody, err := ioutil.ReadAll(res.Body)
    if err != nil {
        log.Printf("Cannot parse sakura response: %v\n", err)
        return err
    }

    if debug {
        log.Printf("sakura response: %q\n", resBody)
    }

    if v != nil {
        return json.Unmarshal(resBody, v)
    }

    return nil
}

错误发生在这一行:

 return json.Unmarshal(resBody, v)

原文由 want_to_be_calm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 955
2 个回答

该错误表明服务器未返回有效的 JSON 响应。我建议添加以下代码来调试问题:

 err := json.Unmarshal(resBody, v)
if err != nil {
    log.Printf("error decoding sakura response: %v", err)
    if e, ok := err.(*json.SyntaxError); ok {
        log.Printf("syntax error at byte offset %d", e.Offset)
    }
    log.Printf("sakura response: %q", resBody)
    return err
}

原文由 Cerise Limón 发布,翻译遵循 CC BY-SA 3.0 许可协议

这个奇怪的错误消息的原因是:

 // When unmarshaling quoted strings, invalid UTF-8 or
// invalid UTF-16 surrogate pairs are not treated as an error.
// Instead, they are replaced by the Unicode replacement
// character U+FFFD.

https://golang.org/src/encoding/json/decode.go

在我的例子中,我将我的 json 保存为字符串,然后通过以下方式解析它: stringData = JSON.parse(myJsonString)

我还有一次使用 gin-context-ShouldBind() ( https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBind ) 并将我的 json 映射到 go object: 错误是因为它需要一个 json 作为字符串,所以我在从前端部分发送请求时使用了:JSON.stringify(jsonObject)。

原文由 Rabhi salim 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题