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
Linda Hamiltonasal
2024-12-22 00:04:17684semak imbas

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)
}

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".

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)
}

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!

Kenyataan:
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