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

时间:2016-08-14 14:14:20

标签: json xml go

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

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

我认为可能的原因是我试图编组不是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)

4 个答案:

答案 0 :(得分:11)

该错误表示服务器未返回有效的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
}

答案 1 :(得分:1)

此怪异错误消息的原因是:

// 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对象,也遇到了相同的错误: 错误是因为它需要json作为字符串,所以在从前端发送请求时使用了JSON.stringify(jsonObject)。

答案 2 :(得分:0)

请先检查请求标头。检查内容类型。就我而言,它不是application/JSON。是application/x-www-form-urlencoded.

答案 3 :(得分:0)

我也有问题。这是因为vue请求api将json数据字符串化,而keep请求数据是json数据。 像curl apiUrl -H '' -d '{"a":1,"b":2}', 不是curl apiUrl -H '' -d 'a=1&b=2', 我认为您的回应是json数据将得到解决