Heim > Backend-Entwicklung > Golang > Warum konvertiert „json.Marshal' von Go []Byte in einen Base64-String und wie kann ich das Problem beheben?

Warum konvertiert „json.Marshal' von Go []Byte in einen Base64-String und wie kann ich das Problem beheben?

Linda Hamilton
Freigeben: 2024-12-22 00:04:17
Original
686 Leute haben es durchsucht

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

Marshalling von []Byte zu JSON: Dekodierung mysteriöser Strings

Beim Versuch, ein Byte-Slice ([]Byte) in das JSON-Format zu konvertieren, stoßen Entwickler oft auf unerwartete String-Darstellungen . Dieser Artikel befasst sich mit den Gründen für dieses Verhalten und bietet eine Lösung für das genaue Marshalling von Byte-Slices.

Der rätselhafte Fall

Betrachten Sie den folgenden Codeausschnitt:

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)
}
Nach dem Login kopieren

Wann ausgeführt, gibt dieser Code Folgendes aus:

{"ByteSlice":"AAAAAQID","SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
Nach dem Login kopieren

Faszinierend, das ByteSlice-Feld, das enthalten sollte Ein Array von Bytes wurde als „AAAAAQID“ gerendert.

Das Rätsel lösen

Die Erklärung finden Sie in der Dokumentation für das JSON-Paket:

Array- und Slice-Werte kodieren als JSON-Arrays, mit der Ausnahme, dass []Byte als Base64-codierte Zeichenfolge und ein Null-Slice als Null-JSON codiert wird Objekt.

In diesem Fall wird das ByteSlice-Feld, ein Array von Bytes, nicht als JSON-Array, sondern als Base64-codierte Zeichenfolge codiert.

Eine Lösung: Base64-Dekodierung

Um []Byte-Daten wie erwartet an JSON zumarshallieren, ist es notwendig, die Base64-Darstellung zu dekodieren. Hier ist eine aktualisierte Version des Codes:

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)
}
Nach dem Login kopieren

Jetzt stellt die resultierende JSON-Ausgabe das ByteSlice-Feld korrekt als Array von Bytes dar:

{"ByteSlice":[0,0,0,1,2,3],"SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum konvertiert „json.Marshal' von Go []Byte in einen Base64-String und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage