Go语言嵌套JSON转Struct失败,请求解决方法
Go嵌套JSON解析失败的解决方法
问题原因
你的代码中存在两个核心问题导致内层ObjectTags数据解析失败:
- 结构体字段访问权限问题:
ObjectTagsList的字段都是小写开头,Go语言中这类字段属于包私有成员,encoding/json包无法通过反射机制访问这些字段,因此JSON中的对应值无法映射到结构体中,最终输出空结构。 - 字段缺失:原JSON中的
tagType字段未在ObjectTagsList结构体中定义,虽然不影响基础解析,但如果需要保留该字段信息,必须补充定义。
解决方案
将ObjectTagsList的字段改为大写开头(公开成员),并添加对应的json标签(确保和JSON键名严格对应,即使大小写匹配也建议显式声明,提升代码健壮性),同时补充tagType字段(若不需要可忽略,但建议保持结构一致)。
修正后的完整代码
package main import ( "encoding/json" "fmt" ) // 字段改为公开(大写开头),添加json标签映射JSON键名,补充tagType字段 type ObjectTagsList struct { TagCode string `json:"tagCode"` TagName string `json:"tagName"` TagValue []string `json:"tagValue"` TagType int `json:"tagType"` } type Model struct { Action string `json:"action"` Business struct { ListId int64 `json:"ListId"` ObjectTags []ObjectTagsList `json:"ObjectTags"` } `json:"business"` } func main() { jsonStr := `{"action":"add","business":{"ListId":123,"ObjectTags":[{"tagCode":"csharp","tagName":"codename","tagValue":["2"],"tagType":3},{"tagCode":"goLang","tagName":"coding","tagValue":["3"],"tagType":3}]}}` var model Model err := json.Unmarshal([]byte(jsonStr), &model) if err != nil { fmt.Println("解析错误:", err) return } // 验证字段访问 fmt.Println(model.Action) // 输出: add fmt.Println(model.Business.ListId) // 输出: 123 fmt.Println(model.Business.ObjectTags[0].TagCode) // 输出: csharp fmt.Println(model.Business.ObjectTags[1].TagName) // 输出: coding fmt.Println(model.Business.ObjectTags[0].TagValue[0]) // 输出: 2 fmt.Println(model.Business.ObjectTags[1].TagType) // 输出: 3 }
关键说明
- 字段访问权限:Go的反射机制仅能访问公开(大写开头)的结构体字段,
encoding/json依赖反射完成JSON与结构体的映射,这是解析成功的核心前提。 - json标签作用:如果结构体字段名与JSON键名不一致,可通过标签指定对应关系;即使一致,显式声明也能避免后续字段名修改导致的解析失败。
- 错误处理:添加
err判断可以及时捕获解析过程中的异常,比如JSON格式错误、字段类型不匹配等问题。
内容的提问来源于stack exchange,提问作者Byte
相关产品推荐
相关产品推荐

