首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板