Rumah >pembangunan bahagian belakang >Golang >Mengapa Slice Go Byte Saya Bertukar kepada 'Strange String' Apabila Marshaled kepada JSON?

Mengapa Slice Go Byte Saya Bertukar kepada 'Strange String' Apabila Marshaled kepada JSON?

Barbara Streisand
Barbara Streisandasal
2024-12-15 11:00:131006semak imbas

Why Does My Go Byte Slice Convert to a

Menyelesaikan Masalah Penukaran Byte-to-JSON: "Strange String" Ditemui

Dalam alam JSON marshaling, cuba mengubah kepingan bait ([]bait) kepada JSON selalunya menghasilkan hasil yang tidak dijangka—rentetan yang kelihatan pelik. Mari kita selidiki sebab di sebalik perkara ini dan terokai kaedah yang betul untuk penukaran JSON.

Sifat "Strange String"

Seperti yang didokumenkan dalam pustaka standard Go (https://golang. org/pkg/encoding/json/#Marshal), hirisan bait dikendalikan secara unik semasa JSON marshaling. Daripada ditukar terus kepada tatasusunan JSON, ia dikodkan menggunakan base64 untuk menghasilkan rentetan. Ini selalunya membawa kepada hasil yang mengelirukan.

Contoh Praktikal

Pertimbangkan coretan kod berikut:

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

Menjalankan kod ini menghasilkan output berikut:

{"ByteSlice":"AAAAAQID"}

AAAAAQID "rentetan pelik" ialah perwakilan berkod base64 bagi hirisan bait [0 0 0 1 2 3].

Memulihkan Kepingan Bait

Untuk mendapatkan hirisan bait asal daripada rentetan yang dikodkan, anda boleh menggunakan pakej base64 dalam Pergi:

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

Output:

[0 0 0 1 2 3]

Kesimpulan

Memahami sebab hirisan bait mempamerkan gelagat ini semasa JSON marshaling adalah penting untuk mengurus data dengan berkesan. Dengan menggunakan mekanisme pengekodan dan penyahkodan base64, ia menjadi tugas mudah untuk menukar antara kepingan bait dan data JSON dengan lancar.

Atas ialah kandungan terperinci Mengapa Slice Go Byte Saya Bertukar kepada 'Strange String' Apabila Marshaled kepada JSON?. 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