go 1.27 中,encoding/json/v2 默认拒绝重复的 json 对象成员名。对于外部输入,解码后先检查错误,只有成功时才使用结果。

用同一份输入对照 v1 和 v2
保存为 main.go,分别解码到两个独立变量。
package main
import (
jsonv1 "encoding/json"
jsonv2 "encoding/json/v2"
"fmt"
)
type payload struct {
Role string `json:"role"`
}
func main() {
raw := []byte(`{"role":"reader","role":"admin"}`)
var a, b payload
err1 := jsonv1.Unmarshal(raw, &a)
err2 := jsonv2.Unmarshal(raw, &b)
fmt.Println("v1:", a.Role, err1 == nil)
fmt.Println("v2 rejected:", err2 != nil)
}
这个标量字段在 v1 示例中会取后值 admin。v2 会报告重复字段错误。不要使用解码失败后可能已经被部分写入的变量。
确认运行工具链版本
检查版本后执行。
go version go run main.go
本例以 Go 1.27 为前提。预期输出 v1: admin true 和 v2 rejected: true。
用合法输入核对成功分支
将示例的 raw 替换成以下单一字段,再重新运行。
raw := []byte(`{"role":"reader"}`)两个包都应成功处理这个简单输入。替换旧包前还需检查项目依赖的其他默认行为。


















