在 JSON 编组领域,尝试将字节切片 ([]byte) 转换为JSON 经常会产生意想不到的结果——一个看似奇怪的字符串。让我们深入探究这背后的原因,并探讨 JSON 转换的正确方法。
Go 标准库中记录的内容 (https://golang. org/pkg/encoding/json/#Marshal),字节切片在 JSON 封送过程中被唯一处理。它们不是直接转换为 JSON 数组,而是使用 base64 进行编码以生成字符串。这通常会导致令人困惑的结果。
考虑以下代码片段:
package main import ( "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { ByteSlice []byte } group := ColorGroup{ ByteSlice: []byte{0, 0, 0, 1, 2, 3}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) }
运行此代码会产生以下输出:
{"ByteSlice":"AAAAAQID"}
“奇怪的字符串”AAAAAQID 是字节切片 [0 0 0 1 2 3].
要从编码字符串中检索原始字节切片,您可以使用 base64 包Go:
package main import ( "encoding/base64" "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { ByteSlice []byte } group := ColorGroup{} b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } err = json.Unmarshal(b, &group) if err != nil { fmt.Println("error:", err) } decodedBytes, err := base64.StdEncoding.DecodeString(group.ByteSlice) if err != nil { fmt.Println("error:", err) } fmt.Println(decodedBytes) }
输出:
[0 0 0 1 2 3]
理解字节切片在 JSON 封送过程中表现出这种行为的原因对于有效管理数据至关重要。利用base64编码和解码机制,字节片和JSON数据之间的无缝转换变得非常简单。
以上是为什么我的 Go 字节切片在编组为 JSON 时会转换为'奇怪的字符串”?的详细内容。更多信息请关注PHP中文网其他相关文章!