Golang Go语言中[]map[string]interface{} 中[]uint8 序列化成了 base64

Golang Go语言中[]map[string]interface{} 中[]uint8 序列化成了 base64
我在用 xorm 做数据操作,如果数字字段,返回的类型是[]uint8
然后 gin 在做序列化时,会被转成 base64 字符串。

而不是我想到的数字。
大伙有没有办法解决这个问题?

3 回复

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标准中,二进制数据不是原生支持的,所以需要一种编码方式来表示。

如果你希望控制这种序列化行为,有几种方法可以考虑:

  1. 自定义序列化:在序列化之前,将[]uint8类型的数据转换为字符串(如果数据是文本)或其他JSON原生支持的类型。

  2. 使用自定义的Marshaller接口:实现json.Marshaller接口,为你的类型提供自定义的序列化逻辑。

  3. 后处理:在序列化完成后,对生成的JSON字符串进行后处理,将Base64编码的字符串替换为你需要的格式(比如十六进制表示)。

  4. 使用第三方库:有些第三方库提供了更灵活的序列化选项,允许你控制二进制数据的表示方式。

选择哪种方法取决于你的具体需求,比如数据的安全性、可读性、以及是否需要在多个地方重复这种处理。如果你只是需要在前端展示这些数据,Base64编码通常是一个简单且有效的解决方案。如果你需要更复杂的处理,可能需要考虑上述的其他方法。

回到顶部