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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:27:07