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

