"顶级值后无效字符'\ x00'"

Oli*_*ley 8 json go

我在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
}
Run Code Online (Sandbox Code Playgroud)

因此,请检查JSON字符串的结束方式.

例如,在此主题中,为了说明潜在的问题:

ReadFromUDP 可以返回任意大小的数据包,从1到2000个字节,您需要使用实际读取的字节数重新填充缓冲区.

json.Unmarshal(buf[:n], &msg)
Run Code Online (Sandbox Code Playgroud)

这个帖子中相同:

request := make([]byte, 1024)
read_len, err := conn.Read(request)
request_right := request[:read_len]
j := new(Json)
err := j.UnmarshalJSON(request) // not working
Run Code Online (Sandbox Code Playgroud)

如果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))解决了上述问题

  • 很好的反馈,比我的答案更准确。+1 (3认同)