首页 > 后端开发 > Golang > 为什么我的 Go 字节切片在编组为 JSON 时会转换为'奇怪的字符串”?

为什么我的 Go 字节切片在编组为 JSON 时会转换为'奇怪的字符串”?

Barbara Streisand
发布: 2024-12-15 11:00:13
原创
1001 人浏览过

Why Does My Go Byte Slice Convert to a

字节到 JSON 转换疑难解答:遇到“奇怪的字符串”

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板