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 回复

我刚了解到字节会在剩余的字节切片大小左侧追加\x00。

解决方案是使用 bytes.Trim() 来修剪它。

bytes.Trim()

更多关于Golang JSON解析时遇到panic如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个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)

原代码的问题在于:

  1. 使用固定大小的缓冲区读取,文件末尾可能有空字节
  2. 循环读取时没有累积数据,只保留了最后一次读取的内容
  3. 缓冲区中未使用的部分被填充为零值,导致JSON解析失败

修复后的代码确保:

  • 完整读取文件内容
  • 去除尾部的空字符和空白
  • 使用清理后的数据进行JSON解析
回到顶部