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
相关产品推荐
相关产品推荐

