Rumah > pembangunan bahagian belakang > Golang > Mengapakah `json.Marshal` Go menukar []bait kepada rentetan base64 dan bagaimana saya boleh membetulkannya?

Mengapakah `json.Marshal` Go menukar []bait kepada rentetan base64 dan bagaimana saya boleh membetulkannya?

Linda Hamilton
Lepaskan: 2024-12-22 00:04:17
asal
686 orang telah melayarinya

Why does Go's `json.Marshal` convert []byte to a base64 string, and how can I fix it?

Marshaling []bait ke JSON: Menyahkod Rentetan Misterius

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.

Kes Membingungkan

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)
}
Salin selepas log masuk

Apabila dilaksanakan, kod ini mengeluarkan:

{"ByteSlice":"AAAAAQID","SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
Salin selepas log masuk

Menarik, Medan ByteSlice, yang sepatutnya mengandungi tatasusunan bait, telah diterjemahkan sebagai "AAAAAQID".

Merungkai Misteri

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.

Penyelesaian: Penyahkodan 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)
}
Salin selepas log masuk

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]}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan