
Go 的 encoding/json 包要求输入必须是符合 RFC 8259 标准的有效 JSON;常见错误是使用单引号或省略键名引号,导致解析失败并静默返回零值(如空切片)。
go 的 `encoding/json` 包要求输入必须是符合 rfc 8259 标准的有效 json;常见错误是使用单引号或省略键名引号,导致解析失败并静默返回零值(如空切片)。
在 Go 中解析 JSON 数组(例如 []int)本身非常简单,但前提是输入字符串必须是严格合法的 JSON。你遇到的 [] 空输出,并非 json.Unmarshal 逻辑错误,而是因为原始字符串 {a:[1,2,3]} 不符合 JSON 规范:JSON 要求对象的所有键(key)必须使用双引号包裹,且字符串值也必须用双引号,不允许单引号或未加引号的键名。
✅ 正确的 JSON 示例:
{"a":[1,2,3]}
❌ 错误的类 JSON(Go 无法识别):
{a:[1,2,3]} // 键 "a" 缺少双引号 → 解析失败
{'a':[1,2,3]} // 单引号非法
{"a":[1,2,"3"]} // 若字段定义为 []int,字符串 "3" 会导致解码错误
以下是修复后的完整可运行代码:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
package main
import (
"encoding/json"
"fmt"
)
type Anything struct {
A []int `json:"a"`
}
func main() {
// ✅ 正确:键名用双引号,整体为合法 JSON 字符串
s := `{"a":[1,2,3]}` // 推荐使用反引号避免转义
var a Anything
err := json.Unmarshal([]byte(s), &a)
if err != nil {
panic(err) // 实际项目中应妥善处理错误
}
fmt.Printf("Parsed array: %v\n", a.A) // 输出:[1 2 3]
}
⚠️ 注意事项:
- 使用反引号(
`)定义 JSON 字符串可避免手动转义双引号,提高可读性与安全性; -
json.Unmarshal在遇到类型不匹配(如期望int但得到string)、语法错误或缺失字段时,不会 panic,而是跳过该字段并保留零值(如[]int变为空切片),因此务必检查err; - 若需容忍松散格式(如无引号键、单引号字符串),需先通过第三方库(如
github.com/buger/jsonparser)预处理,但不推荐——应由数据提供方保证 JSON 合规性。
总结:Go 的 JSON 解析器严格遵循标准。确保输入是有效 JSON 是成功解析 []int 或任何结构体字段的前提;调试时可借助 JSONLint 验证字符串合法性。










