为何两个Go语言JSON Unmarshal示例表现不同?Bar.Url未赋值原因
问题原因:JSON标签使用了错误的引号类型
你的问题核心出在Bar结构体的JSON标签语法错误:Go语言规定结构体标签必须使用双引号(")包裹,而你用了单引号('),导致encoding/json包无法识别这个标签,自然没法把JSON里的web_url映射到Bar.Url字段。
详细解释
Foo结构体能正常解析的原因:
Go的encoding/json包默认会将结构体字段名的首字母转为小写,以此匹配JSON中的字段名。Foo的字段Web_url首字母小写后是web_url,和JSON里的字段名完全一致,所以能成功解析。Bar结构体解析失败的原因:
你给Bar.Url加的标签是json:'web_url',这里的单引号不符合Go的语法规范——结构体标签必须是一个用双引号包裹的字符串。因为标签不合法,json包会忽略这个标签,转而使用默认的字段名映射逻辑:Url首字母小写是url,而JSON里没有url字段,所以最终Bar.Url是空字符串。
修正后的代码
把Bar结构体的标签改成双引号即可:
package main import ( "encoding/json" "fmt" "testing" ) type Foo struct { Web_url string } type Bar struct { Url string `json:"web_url"` // 将单引号替换为双引号 } func TestJson(t *testing.T) { j := []byte(`{"web_url":"xyz"}`) f := &Foo{} err := json.Unmarshal(j, f) fmt.Printf("err: %v, f: %+v\n", err, f) b := &Bar{} err = json.Unmarshal(j, b) fmt.Printf("err: %v, b: %+v\n", err, b) }
修正后的执行结果
运行测试后会得到正确的解析结果:
go test -v -run TestJson === RUN TestJson err: <nil>, f: &{Web_url:xyz} err: <nil>, b: &{Url:xyz} --- PASS: TestJson (0.00s) PASS ok gitlabsr.nuq.ion.nokia.net/sr/linux/gitlab-tools/internal/junk
内容的提问来源于stack exchange,提问作者agapanthusblue
相关产品推荐
相关产品推荐

