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

JSON反序列化字段为空问题:已尝试大写变量仍无效

解决Go JSON反序列化字段为空的问题

我来帮你搞定这个问题!你的JSON反序列化后字段全空,核心原因是结构体字段和JSON中的键名没有正确映射——哪怕把字段改成大写了,Go的encoding/json包也没法自动识别不匹配的键名,得显式用json标签来指定对应关系。

问题拆解

咱们一步步捋清楚哪里出问题了:

  • 外层Person结构体的MoreDetails字段,JSON里对应的键是moreDetails(驼峰命名),但Go默认会把大写开头的字段转成全小写(比如MoreDetails会被识别成moredetails),两者不匹配;
  • 嵌套的FirstName结构体里的Name1,JSON里对应的键是firstName,完全没对应上;SecondName的Name2对应JSON里的surName,同样没有映射关系;
  • 你之前没检查json.Unmarshal的返回错误,万一有格式问题也没法及时发现。

修正后的代码

直接看修改后的完整代码,每一处改动我都加了注释:

package main

import (
	"encoding/json"
	"fmt"
)

// 给Name1字段加json标签,对应JSON里的firstName
type FirstName struct {
	Name1 string `json:"firstName"`
}

// 给Name2字段加json标签,对应JSON里的surName
type SecondName struct {
	Name2 string `json:"surName"`
}

// 给外层字段加json标签,对应JSON里的details和moreDetails
type Person struct {
	Details     FirstName  `json:"details"`
	MoreDetails SecondName `json:"moreDetails"`
}

func main() {
	var someGuy Person
	var data = []byte(`{"details": {"firstName": "alan"}, "moreDetails": {"surName": "Turing"}}`)
	// 一定要检查反序列化的错误!
	err := json.Unmarshal(data, &someGuy)
	if err != nil {
		fmt.Println("反序列化出错:", err)
		return
	}
	fmt.Println(someGuy)
	// 也可以打印更直观的格式
	fmt.Printf("名字:%s,姓氏:%s\n", someGuy.Details.Name1, someGuy.MoreDetails.Name2)
}

运行结果

现在运行代码,就能得到正确的输出了:

{{alan} {Turing}}
名字:alan,姓氏:Turing

关键知识点

  • Go的encoding/json包只会处理大写开头的字段(只有导出的字段才能被外部包访问),这一点你已经做对了;
  • 当JSON键名和结构体字段名不一致时(比如驼峰、下划线命名 vs 自定义字段名),必须用json:"键名"标签来建立映射;
  • 永远记得检查json.Unmarshal的返回错误,这能帮你快速定位JSON格式错误、字段类型不匹配等问题。

内容的提问来源于stack exchange,提问作者aniztar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:13