Golang Go语言中[]map[string]interface{} 中[]uint8 序列化成了 base64
Golang Go语言中[]map[string]interface{} 中[]uint8 序列化成了 base64
我在用 xorm 做数据操作,如果数字字段,返回的类型是[]uint8
然后 gin 在做序列化时,会被转成 base64 字符串。
而不是我想到的数字。
大伙有没有办法解决这个问题?
Array and slice values encode as JSON arrays, except that []byte encodes as a base64-encoded string, and a nil slice encodes as the null JSON value.
https://golang.org/pkg/encoding/json/#Marshal
如果是数字的话,内存里面表示不应该是[]uint8 的,看看是不是 xorm 用法错误?笨方法是定义一个新类型,然后写 Marshaler 接口,不过我猜应该不需要这种大杀器,虽然没看过,不过没理由 xorm 不支持这么基本的功能
更多关于Golang Go语言中[]map[string]interface{} 中[]uint8 序列化成了 base64的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
作者的确是这么回复的,就转成[]unit8
目前我只能想到手工转一下。
在Go语言中,当你使用json.Marshal
或其他序列化库将[]map[string]interface{}
类型的数据转换为JSON时,如果其中某个interface{}
的值是[]uint8
类型(通常表示字节切片或二进制数据),序列化过程会默认将其转换为Base64编码的字符串。这是因为在JSON标准中,二进制数据不是原生支持的,所以需要一种编码方式来表示。
如果你希望控制这种序列化行为,有几种方法可以考虑:
-
自定义序列化:在序列化之前,将
[]uint8
类型的数据转换为字符串(如果数据是文本)或其他JSON原生支持的类型。 -
使用自定义的Marshaller接口:实现
json.Marshaller
接口,为你的类型提供自定义的序列化逻辑。 -
后处理:在序列化完成后,对生成的JSON字符串进行后处理,将Base64编码的字符串替换为你需要的格式(比如十六进制表示)。
-
使用第三方库:有些第三方库提供了更灵活的序列化选项,允许你控制二进制数据的表示方式。
选择哪种方法取决于你的具体需求,比如数据的安全性、可读性、以及是否需要在多个地方重复这种处理。如果你只是需要在前端展示这些数据,Base64编码通常是一个简单且有效的解决方案。如果你需要更复杂的处理,可能需要考虑上述的其他方法。