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

Go自定义map类型反序列化JSON数组时无法正确映射自定义值问题

Go自定义map类型JSON反序列化异常解决方法

问题根因

  • 结构体字段未导出:yp 结构体的 f1、f2 字段首字母为小写,属于包内私有字段,encoding/json 包无法访问私有字段完成赋值。
  • 字段类型不匹配:JSON 响应中 f2 的值为字符串格式(如 "2"),但结构体中 f2 定义为 int 类型,默认反序列化规则不支持自动转换。
  • 未捕获反序列化错误:原代码没有接收 json.Unmarshal 返回的错误信息,无法定位具体异常原因。

修复方案

  1. 将 yp 结构体的字段首字母改为大写,增加 JSON 标签绑定原字段名
  2. 给 F2 字段增加 ,string 标签选项,支持将字符串格式的数字自动转换为 int 类型
  3. 增加反序列化错误判断逻辑

修复后完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:03:04