"无效字符' \ x00'在顶级价值之后#34;

时间:2014-08-07 16:32:57

标签: json go

我在for循环中解组json时遇到此错误。 第一次通过循环是很好的解组,但在下一次迭代中我得到了这个错误。

我是Golang的新手,此错误信息不明确。有人可以解释一下这种错误发生在什么情况下以及我应该如何避免它。

2 个答案:

答案 0 :(得分:17)

查看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字符串的结束方式。

例如,在this thread中,为了说明潜在的问题:

  

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

json.Unmarshal(buf[:n], &msg)

this thread中相同:

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)不起作用的原因。

答案 1 :(得分:9)

感谢您回答我的问题。

这个错误是由于错误的json之前没有更多的故事,

我有一个json.RawMessage类型的字段 detail 我有SELECT查询,我试图从表中读取json并扫描到 detail 并将其附加到结构

当我查看详细信息 JSON时,for循环结束后,无论是否使用大括号,它都会多次获得相同的记录。在给予它如此多的思考之后,我认为使用byte帮助构建详细信息。

例如:而不仅仅是rows.Scan(&amp; detail)试试这个: rows.Scan((* [] byte)(&amp; detail))解决了上述问题