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

动态键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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:19:55