动态键JSON响应转Go结构体遇阻,求结构体定义协助
解决Go中动态键JSON的反序列化问题
我来帮你搞定这个动态键JSON的反序列化问题!先看看你的JSON结构:
{ "accountDetails": { "123": { "userDetails": { "login": 123 } }, "456": { "userDetails": { "login": 456 } } } }
你的原结构体定义有两个核心问题:一是缺少正确的JSON标签映射,二是结构体层级和JSON结构不匹配。下面是修正后的结构体定义,以及完整的示例代码:
正确的结构体定义
type Response struct { // 直接用map[string]UserContainer对应accountDetails里的动态键 AccountDetails map[string]UserContainer `json:"accountDetails"` } // 对应每个动态键下的对象,包含userDetails字段 type UserContainer struct { UserDetails Account `json:"userDetails"` } // 对应userDetails里的具体内容 type Account struct { Login int `json:"login"` }
反序列化示例代码
package main import ( "encoding/json" "fmt" ) // 上面的结构体定义放在这里 func main() { jsonStr := `{ "accountDetails": { "123": { "userDetails": { "login": 123 } }, "456": { "userDetails": { "login": 456 } } } }` var resp Response err := json.Unmarshal([]byte(jsonStr), &resp) if err != nil { fmt.Println("反序列化失败:", err) return } // 遍历验证结果 for accountID, container := range resp.AccountDetails { fmt.Printf("账号ID: %s, 登录ID: %d\n", accountID, container.UserDetails.Login) } }
为什么原结构体不行?
- 原
AccountDetails结构体中的Accounts字段没有添加json:"accountDetails"标签,Go的JSON解析器无法将JSON中的accountDetails字段映射到这个结构体字段; - 层级不匹配:JSON里
accountDetails下的每个动态键直接对应一个包含userDetails的对象,而原结构体里AccountDetails的Accounts是map[string]UserDetails,但UserDetails又嵌套了Account,这就多了一层,导致解析时无法正确匹配结构。
运行上面的示例代码,你就能成功把动态键的JSON反序列化为Go结构体啦!
内容的提问来源于stack exchange,提问作者mikaint
相关产品推荐
相关产品推荐

