
本文介绍如何使用 Go 标准库 encoding/json 将形如 "[[0,1],[0,2],[0,3]]" 的 JSON 字符串解析为可遍历的 [][]int 类型,避免不安全的动态求值,并提供完整可运行示例与关键注意事项。
本文介绍如何使用 go 标准库 `encoding/json` 将形如 `"[[0,1],[0,2],[0,3]]"` 的 json 字符串解析为可遍历的 `[][]int` 类型,避免不安全的动态求值,并提供完整可运行示例与关键注意事项。
Go 是强类型静态语言,不支持类似 JavaScript 的 eval() 或 Python 的 ast.literal_eval(),因此不能直接执行字符串代码来构造数据结构。但幸运的是,你提供的字符串 "[[0, 1], [0, 2], [0,3 ]]" 符合 JSON 语法规范(空格和末尾逗号均被 JSON 解析器兼容),这使得标准库中的 encoding/json 成为最安全、最推荐的解决方案。
核心步骤仅三步:
-
声明目标类型变量(如
var data [][]int); -
创建 JSON 解码器,将字符串包装为
io.Reader(常用strings.NewReader(s)); -
调用
Decode(&variable),传入变量地址完成反序列化。
以下是完整可运行示例:
package main
import (
"encoding/json"
"fmt"
"strings"
)
func main() {
jsonstring := "[[0, 1], [0, 2], [0, 3]]" // 注意:原始字符串中空格不影响解析
var matrix [][]int
err := json.Unmarshal([]byte(jsonstring), &matrix)
if err != nil {
panic(fmt.Sprintf("JSON 解析失败: %v", err))
}
fmt.Printf("解析成功: %+v\n", matrix) // 输出: [[0 1] [0 2] [0 3]]
// 安全遍历二维切片
for i, row := range matrix {
for j, val := range row {
fmt.Printf("matrix[%d][%d] = %d\n", i, j, val)
}
}
}
✅ 推荐使用
json.Unmarshal而非json.NewDecoder:对于字符串解析,json.Unmarshal([]byte(s), &v)更简洁直观,语义清晰,且性能相当;NewDecoder更适用于流式读取(如文件或网络响应)。
⚠️ 重要注意事项:
-
类型必须严格匹配:若字符串含小数(如
[0.5, 1.0]),[][]int会解码失败;此时应改用[][]float64或自定义UnmarshalJSON方法。 -
空值/缺失字段需额外处理:JSON 中的
null无法直接映射到int,建议使用指针(*int)或sql.NullInt64等可空类型。 -
安全性保障:
encoding/json不执行任意代码,杜绝了eval类风险,符合生产环境安全要求。 -
性能提示:对于高频解析场景,可复用
json.Decoder实例并调用decoder.DisallowUnknownFields()提升健壮性。
总结:将 JSON 字符串转为 Go 原生数据结构,始终优先选用 encoding/json —— 它是标准、安全、高效且类型明确的标准方案。











