3 回答
TA贡献1744条经验 获得超4个赞
首先,正如已评论的那样,您确定不能go/build直接使用该包而不是运行go list吗?
我不会在 HTTP 处理程序中使用println(或fmt.Println)。使用log.Println和/或将错误放入ResponseWriter. 此外,最好ListenAndServe用log.Fatal.
打印/记录error值时,您可以只使用err,无需使用err.Error().
此外,当您实际上想要做一些比报告/记录错误消息更详细的事情时,您可以查看它的类型和其他信息。例如,log.Printf("verbose error info: %#v", err)给出:
&json.SyntaxError{msg:"invalid character ',' looking for beginning of value", Offset:0}
我试过这个是因为我知道json包返回各种错误类型和附加信息,我希望偏移值会有所帮助。如果是这样,那么这样的事情可能会有所帮助:
if err := json.Compact(…) {
if err != nil {
log.Println("json.Compact:", err)
if serr, ok := err.(*json.SyntaxError); ok {
log.Println("Occurred at offset:", serr.Offset)
// … something to show the data in buff around that offset …
}
}
}
但偏移零没有帮助:(
因此,尽管这不能确定您的问题,但希望它可以对您的进一步调查有所帮助。
编辑:
所以添加后:
log.Println("Write file:", ioutil.WriteFile("data.json", buff.Bytes(), 0600))
对于上面的错误处理块,我然后在结果文件上运行了一个 JSON 验证器,它识别了这一部分:
"XTestImports": [
"io",
"log",
"net"
]
},,{
"Dir": "/usr/local/go/src/mime",
"ImportPath": "mime",
"Name": "mime",
注意双,,.
这应该告诉您代码中的错误是什么。但如果没有,您需要在处理t.J或构建时跳过空条目。后者更好,只涉及:
if len(newj) > 0 {
myObj.J = append(myObj.J, newj)
}
(顺便说一句,您不检查错误,json.Unmarshal因此不清楚它是否应该为空或由于前面的错误而为空。永远不要忽略错误返回!)
TA贡献1817条经验 获得超14个赞
我在 Go 程序中也遇到了同样的错误消息,但是当我的 HTTP 响应解析器期望 JSON 时,错误消息在 HTTP 响应错误中,采用 HTML 格式。
对我来说,解决方案是更改我的请求以包括将Content-Type
标头设置为application/json
. 您如何执行此操作取决于您碰巧使用的是哪个 http 客户端库;如果您有权访问http.Header
核心类型,则可以使用.Set(...)
.
我意识到这个修复对我来说的范围可能不适用于最初的问题,但我在谷歌搜索后首先来到这里并认为这会帮助其他人,因为乍一看消息并不是特别明显。提示是无效<
字符是错误/响应中的第一个 HTML 字符,这很可能是请求类型未设置为 的结果application/json
,因此服务器以非 JSON 响应进行响应。
- 3 回答
- 0 关注
- 265 浏览
添加回答
举报