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

Golang中如何将JSON的planets字段反序列化为map[string]int?

解决Go中JSON的planets字段直接反序列化为map[string]int的问题

嘿,我懂你想直接用索引访问planets里元素的需求,当前代码里的嵌套结构体完全是多余的,咱们直接调整结构体定义就能解决问题。

问题根源

你现在把Planets定义成了一个嵌套结构体,里面的Planet字段才是map类型,这就导致你必须通过user.Planets.Planet["EARTH"]才能访问,而且拿到的还是*json.RawMessage,还得二次解析,完全没必要绕这个弯。

正确的结构体定义

直接把Planets的类型设为map[string]int,同时保留对应的json:"planets"标签,这样Go的encoding/json包会自动把JSON里的planets对象转换成map[string]int类型:

type User struct {
    ID      string          `json:"id"`
    Name    string          `json:"name"`
    Planets map[string]int  `json:"planets"` // 直接定义为map[string]int
}

完整运行代码

替换结构体后,你的main函数可以直接访问planets里的元素,不需要额外处理:

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    ID      string          `json:"id"`
    Name    string          `json:"name"`
    Planets map[string]int  `json:"planets"`
}

func main() {
    data := `{ "id": "me", "name": "myname", "planets": { "EARTH": 3, "MARS": 4 } }`
    user := &User{}
    err := json.Unmarshal([]byte(data), user)
    if err != nil {
        fmt.Println("ERROR " + err.Error())
        return
    }

    fmt.Println(user.ID)       // 输出: me
    fmt.Println(user.Name)     // 输出: myname
    fmt.Println(user.Planets["EARTH"]) // 输出: 3
    fmt.Println(user.Planets["MARS"])  // 输出: 4
}

原理说明

Go的encoding/json包原生支持将JSON对象(键值对形式)反序列化为map类型,只要map的键值类型和JSON里的类型匹配:

  • JSON里的planets键是字符串类型,对应map的键类型string
  • JSON里的planets值是整数类型,对应map的值类型int

这样反序列化完成后,你就能像操作普通map一样直接用user.Planets["EARTH"]访问对应的值,完全不需要额外的反序列化步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:03:59