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