Go自定义time别名实现MarshalJSON返回int64字节流序列化报错咨询
错误根本原因
encoding/json包的Marshaler接口有强制契约要求:你实现MarshalJSON()方法返回的字节切片,必须是合法的JSON值片段,可以直接嵌入到最终的JSON结构中,你当前的写法违背了这个契约。
你现在用binary.PutVarint输出的是Unix时间戳的二进制内存编码,不是JSON标准要求的数值字符编码:
- 你测试用的时间戳
1626132059做varint编码后的首字节是0xB6,对应ASCII字符就是报错里提到的¶ - JSON语法要求数值类型必须以
0-9、+、-开头,字符串类型必须以双引号"开头,你的二进制字节不属于任何合法JSON值的开头,所以json包在校验序列化结果时直接抛出异常。
正确实现参考
如果你需要输出数值类型的Unix时间戳,直接把整数转成ASCII数字字节即可,不需要用binary做二进制编码:
import "strconv" func (t NotifyTime) MarshalJSON() ([]byte, error) { unixTime := time.Time(t).Unix() return strconv.AppendInt(nil, unixTime, 10), nil }
如果需要输出字符串格式的时间戳,只要在外层补双引号即可:
func (t NotifyTime) MarshalJSON() ([]byte, error) { unixTime := time.Time(t).Unix() return []byte(strconv.Quote(strconv.FormatInt(unixTime, 10))), nil }
内容的提问来源于stack exchange,提问作者tpham
相关产品推荐
相关产品推荐

