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.
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) }
Wann ausgeführt, gibt dieser Code Folgendes aus:
{"ByteSlice":"AAAAAQID","SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
Faszinierend, das ByteSlice-Feld, das enthalten sollte Ein Array von Bytes wurde als „AAAAAQID“ gerendert.
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.
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) }
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]}
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!