Go自定义map类型反序列化JSON数组时无法正确映射自定义值问题
Go自定义map类型JSON反序列化异常解决方法
问题根因
- 结构体字段未导出:
yp结构体的f1、f2字段首字母为小写,属于包内私有字段,encoding/json包无法访问私有字段完成赋值。 - 字段类型不匹配:JSON 响应中
f2的值为字符串格式(如"2"),但结构体中f2定义为int类型,默认反序列化规则不支持自动转换。 - 未捕获反序列化错误:原代码没有接收
json.Unmarshal返回的错误信息,无法定位具体异常原因。
修复方案
- 将
yp结构体的字段首字母改为大写,增加 JSON 标签绑定原字段名 - 给
F2字段增加,string标签选项,支持将字符串格式的数字自动转换为 int 类型 - 增加反序列化错误判断逻辑
修复后完整代码
package main import ( "encoding/json" "fmt" ) type id map[string]yp type yp struct { F1 string `json:"f1"` F2 int `json:"f2,string"` // string标签支持自动转换字符串格式的数字为int } func main() { data := []byte("[{\"unique1\":{\"f1\":\"1\",\"f2\":\"2\"}},{\"unique2\":{\"f1\":\"4\",\"f2\":\"7\"}}]") var i []id // 捕获反序列化错误 err := json.Unmarshal(data, &i) if err != nil { fmt.Printf("反序列化失败:%v\n", err) return } fmt.Printf("%v", i) }
运行结果
输出为:[map[unique1:{1 2}] map[unique2:{4 7}]]
符合预期的反序列化结果。
内容的提问来源于stack exchange,提问作者the_big_blackbox
相关产品推荐
相关产品推荐

