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

自定义JSON Marshaller支持Base64编码报错排查求助

问题分析

你的自定义MarshalJSON方法返回的是Base64编码后的原始字节,但JSON规范要求字符串类型的值必须被双引号包裹。当前返回的字节是类似eyJUaW1l...的裸内容,没有引号,Gin在整体序列化时会将其当作JSON值解析,从而触发invalid character 'e' looking for beginning of value错误。

另外,你原代码中使用json.NewEncoder(&buff).Encode(x)会在序列化结果末尾添加换行符\n,这会导致Base64编码包含不必要的换行字符,不符合你期望的输出格式。

解决方案

修改MarshalJSON方法,确保返回的是符合JSON规范的带引号字符串字节:

方法一(推荐,利用标准库处理字符串序列化)

func (t Temp) MarshalJSON() ([]byte, error) {
    type __ Temp
    x := __(t)
    // 直接用json.Marshal序列化Temp,避免额外换行符
    raw, err := json.Marshal(x)
    if err != nil {
        return nil, err
    }
    // 对JSON字节做Base64编码
    b64Str := base64.StdEncoding.EncodeToString(raw)
    // 将Base64字符串序列化为JSON格式的字符串(自动添加双引号)
    return json.Marshal(b64Str)
}

方法二(手动拼接引号)

如果想手动控制字符串格式,也可以直接拼接双引号,但不如方法一可靠(避免特殊字符转义问题):

func (t Temp) MarshalJSON() ([]byte, error) {
    type __ Temp
    x := __(t)
    raw, err := json.Marshal(x)
    if err != nil {
        return nil, err
    }
    b64Str := base64.StdEncoding.EncodeToString(raw)
    // 手动为Base64字符串添加双引号,符合JSON字符串格式
    return []byte(`"` + b64Str + `"`), nil
}
验证效果

修改后,Gin的c.JSON方法序列化时会得到你期望的输出:

{
    "token":"eyJUaW1lIjoiMjAyMi0wOC0wNlQwMDo0ODoyOS4yNDEzNTUrMDU6MzAifQ=="
}

内容的提问来源于stack exchange,提问作者vkstack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:45:28