Golang JSON解析时遇到panic如何解决
Golang JSON解析时遇到panic如何解决
错误:panic: invalid character '\x00' after top-level value
代码:
f, e := os.OpenFile(pathFile, os.O_RDWR, 0644)
checkErr(e)
defer f.Close()
b := make([]byte, 1024)
for {
ln, e := f.Read(b)
if e != io.EOF {
checkErr(e)
}
if ln == 0 {
break
}
}
fmt.Println(string(b)) // [{"key":"v a l u e"}] json shown here
var d []struct{
Title string
Body string
}
e = json.Unmarshal(b, &d)
checkErr(e) // error thrown here
更多关于Golang JSON解析时遇到panic如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
这个panic错误是由于JSON数据中包含空字符\x00导致的。问题出现在读取文件时没有正确处理文件末尾的空白字节。
以下是修复后的代码:
f, e := os.OpenFile(pathFile, os.O_RDWR, 0644)
checkErr(e)
defer f.Close()
// 方法1:使用ioutil.ReadAll(推荐)
data, e := io.ReadAll(f)
checkErr(e)
// 去除可能的空字符和空白
jsonStr := strings.TrimRight(string(data), "\x00")
jsonStr = strings.TrimSpace(jsonStr)
fmt.Println(jsonStr) // [{"key":"v a l u e"}]
var d []struct{
Title string
Body string
}
e = json.Unmarshal([]byte(jsonStr), &d)
checkErr(e)
或者使用更简洁的方式:
f, e := os.OpenFile(pathFile, os.O_RDWR, 0644)
checkErr(e)
defer f.Close()
// 方法2:直接读取文件内容
data, e := os.ReadFile(pathFile)
checkErr(e)
// 清理JSON数据
jsonData := bytes.TrimRight(data, "\x00")
jsonData = bytes.TrimSpace(jsonData)
var d []struct{
Title string
Body string
}
e = json.Unmarshal(jsonData, &d)
checkErr(e)
原代码的问题在于:
- 使用固定大小的缓冲区读取,文件末尾可能有空字节
- 循环读取时没有累积数据,只保留了最后一次读取的内容
- 缓冲区中未使用的部分被填充为零值,导致JSON解析失败
修复后的代码确保:
- 完整读取文件内容
- 去除尾部的空字符和空白
- 使用清理后的数据进行JSON解析


