You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两个Go语言JSON Unmarshal示例表现不同?Bar.Url未赋值原因

问题原因:JSON标签使用了错误的引号类型

你的问题核心出在Bar结构体的JSON标签语法错误:Go语言规定结构体标签必须使用双引号(")包裹,而你用了单引号('),导致encoding/json包无法识别这个标签,自然没法把JSON里的web_url映射到Bar.Url字段。

详细解释

  1. Foo结构体能正常解析的原因:
    Go的encoding/json包默认会将结构体字段名的首字母转为小写,以此匹配JSON中的字段名。Foo的字段Web_url首字母小写后是web_url,和JSON里的字段名完全一致,所以能成功解析。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:18:14