
本文介绍如何使用 Go 标准库 encoding/json 将形如 "[[0, 1], [0, 2], [0, 3]]" 的 JSON 风格字符串解析为可遍历的 [][]int 类型,避免不安全的动态求值,兼顾类型安全与简洁性。
本文介绍如何使用 go 标准库 `encoding/json` 将形如 `"[[0, 1], [0, 2], [0, 3]]"` 的 json 风格字符串解析为可遍历的 `[][]int` 类型,避免不安全的动态求值,兼顾类型安全与简洁性。
Go 是一门强类型语言,不支持类似 Python 的 eval() 或 JavaScript 的 JSON.parse()(无类型约束)这种直接执行字符串代码的机制。因此,将字符串 "[[0, 1], [0, 2], [0, 3]]" 转为可用的二维切片,不能靠“运行时解释”,而应借助结构化数据协议——幸运的是,该字符串本身符合 JSON 数组语法,天然适配 encoding/json 包。
核心步骤仅三步:
-
声明目标类型变量:明确指定接收结构,例如
var data [][]int; -
构造 JSON 解码器:使用
json.NewDecoder(strings.NewReader(s))将字符串转为可读流; -
执行解码:调用
dec.Decode(&data),自动完成类型校验与反序列化。
以下是完整、可运行的示例:
package main
import (
"encoding/json"
"fmt"
"strings"
)
func main() {
jsonstring := "[[0, 1], [0, 2], [0, 3]]" // 注意:原始字符串含空格不影响 JSON 解析
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.Decoder:对于内存中字符串,json.Unmarshal([]byte(s), &v)更简洁、高效,且语义更清晰;Decoder更适用于流式输入(如文件或网络响应)。
Wjs Uploading Video下载将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
⚠️ 注意事项:
- 字符串必须是合法 JSON:外层为方括号
[],嵌套数组也需用[],数字间允许空格(JSON 规范支持),但不可出现单引号、未引号键名或 JS 特有语法(如尾随逗号在旧版 Go 中可能报错); - 类型必须严格匹配:若字符串含小数(如
[0.5]),[][]int会解码失败;此时应改用[][]float64或自定义UnmarshalJSON方法; - 错误处理不可省略:始终检查
err != nil,避免静默失败导致后续 panic; - 若数据来源不可信(如用户输入),JSON 解析本身具备基本安全性(不会执行代码),但仍建议配合长度/深度限制(通过自定义
json.Decoder的DisallowUnknownFields()或预校验)防范恶意超大 payload。
总结:Go 中字符串到数组的转换,本质是数据反序列化过程。选择 encoding/json 不仅安全、标准、高效,还天然契合 Go 的类型哲学——让结构清晰可见,错误尽早暴露。











