自定义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
相关产品推荐
相关产品推荐

