Rumah >pembangunan bahagian belakang >Golang >Mengapakah `json.Marshal` Go menukar []bait kepada rentetan base64 dan bagaimana saya boleh membetulkannya?
Apabila cuba menukar kepingan bait ([]bait) kepada format JSON, pembangun sering menghadapi perwakilan rentetan yang tidak dijangka . Artikel ini menyelidiki sebab tingkah laku ini dan menyediakan penyelesaian untuk menyusun kepingan bait dengan tepat.
Pertimbangkan coretan kod berikut:
import ( "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { ByteSlice []byte SingleByte byte IntSlice []int } group := ColorGroup{ ByteSlice: []byte{0, 0, 0, 1, 2, 3}, SingleByte: 10, IntSlice: []int{0, 0, 0, 1, 2, 3}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) }
Apabila dilaksanakan, kod ini mengeluarkan:
{"ByteSlice":"AAAAAQID","SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
Menarik, Medan ByteSlice, yang sepatutnya mengandungi tatasusunan bait, telah diterjemahkan sebagai "AAAAAQID".
Penjelasan terletak pada dokumentasi untuk pakej json:
Nilai tatasusunan dan hirisan mengekod sebagai tatasusunan JSON, kecuali []bait mengekod sebagai rentetan berkod base64 dan kepingan nil mengekod sebagai objek JSON nol.
Dalam kes ini, medan ByteSlice, tatasusunan bait, tidak dikodkan sebagai tatasusunan JSON sebaliknya sebagai rentetan berkod base64.
Untuk mengawal []data bait kepada JSON seperti yang dijangkakan, anda perlu menyahkod perwakilan base64. Berikut ialah versi kod yang dikemas kini:
package main import ( "encoding/base64" "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { ByteSlice []byte SingleByte byte IntSlice []int } group := ColorGroup{ ByteSlice: []byte{0, 0, 0, 1, 2, 3}, SingleByte: 10, IntSlice: []int{0, 0, 0, 1, 2, 3}, } // Decode ByteSlice from base64 before marshaling decodedByteSlice, err := base64.StdEncoding.DecodeString(string(group.ByteSlice)) if err != nil { fmt.Println("error:", err) } group.ByteSlice = decodedByteSlice b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) }
Kini, output JSON yang terhasil dengan betul mewakili medan ByteSlice sebagai tatasusunan bait:
{"ByteSlice":[0,0,0,1,2,3],"SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
Atas ialah kandungan terperinci Mengapakah `json.Marshal` Go menukar []bait kepada rentetan base64 dan bagaimana saya boleh membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!