Go语言json.Marshal序列化[][]uint8多维数组结果异常问题咨询
问题成因
Go 标准库的encoding/json包默认将[]uint8(即[]byte的类型别名)序列化为 Base64 编码的字符串,这是官方预设的二进制数据通用传输规则。你定义的[][]uint8类型本质是元素为[]uint8的切片,序列化时每一个内层切片都会被单独转为 Base64 字符串,最终呈现出你观测到的"AQEBAQ=="这类输出。
解决方案
根据业务场景可以选择以下两种方案:
- 方案一:调整结构体字段类型(成本最低,适用于允许修改类型定义的场景)
将结构体中MyArray的类型从[][]uint8改为[][]int或[][]uint,修改后序列化就会输出预期的数字数组格式,示例修改如下:
type MyStruct struct { MyArray [][]int `json:"arr"` // 替换原[][]uint8类型 Name string `json:"name"` }
对应构造结构体的逻辑同步调整内层切片的类型为[]int即可。
- 方案二:实现自定义序列化方法(适用于不能修改原有结构体类型的场景)
给MyStruct实现自定义的MarshalJSON方法,手动控制序列化逻辑,不影响原有业务代码的运行:
func (m *MyStruct) MarshalJSON() ([]byte, error) { // 定义别名避免递归序列化 type Alias MyStruct // 临时结构体替换字段类型实现数字数组输出 tmp := &struct { MyArray [][]int `json:"arr"` *Alias }{ Alias: (*Alias)(m), } // 类型转换 tmp.MyArray = make([][]int, len(m.MyArray)) for i := range m.MyArray { tmp.MyArray[i] = make([]int, len(m.MyArray[i])) for j := range m.MyArray[i] { tmp.MyArray[i][j] = int(m.MyArray[i][j]) } } return json.Marshal(tmp) }
添加该方法后,原有代码无需其他改动,序列化结果就会符合预期。
内容的提问来源于stack exchange,提问作者dmcblue
相关产品推荐
相关产品推荐

