我在for循环中解组json时遇到此错误.第一次通过循环是解组很好但在下一次迭代我得到这个错误.
我是golang的新手,这个错误信息不清楚.有人可以解释这种错误发生在什么情况下以及我应该如何避免它.
Von*_*onC 18
看一下源代码 encoding/json/scanner.go
// stateEndTop is the state after finishing the top-level value,
// such as after reading `{}` or `[1,2,3]`.
// Only space characters should be seen now.
func stateEndTop(s *scanner, c int) int {
    if c != ' ' && c != '\t' && c != '\r' && c != '\n' {
        // Complain about non-space byte on next call.
        s.error(c, "after top-level value")
    }
    return scanEnd
}
因此,请检查JSON字符串的结束方式.
例如,在此主题中,为了说明潜在的问题:
ReadFromUDP可以返回任意大小的数据包,从1到2000个字节,您需要使用实际读取的字节数重新填充缓冲区.
json.Unmarshal(buf[:n], &msg)
在这个帖子中相同:
request := make([]byte, 1024)
read_len, err := conn.Read(request)
request_right := request[:read_len]
j := new(Json)
err := j.UnmarshalJSON(request) // not working
如果
read_len < len(request)那么请求将\x00在末尾包含额外的" ",这就是为什么UnmarshalJSON(request)不起作用.
Oli*_*ley 11
谢谢你回答我的问题.
这个错误来自于错误的json,之前还有更多的故事,
我有一个json.RawMessage类型的字段详细信息我有SELECT查询,我试图从表中读取json并扫描到详细信息并将其附加到结构.
在for循环结束后,当我查看详细信息时, JSON在有和没有结束括号的情况下多次获得相同的记录.在给予它如此多的思考之后,我认为使用byte帮助构建详细信息.
例如:而不仅仅是rows.Scan(&detail)试试这个:rows.Scan((*[] byte)(&detail))解决了上述问题