Heim > Artikel > Backend-Entwicklung > Wie gehen Sie mit []Byte-Feldern in Go um, wenn Sie JSON kodieren und dekodieren?
JSON mit []Byte-Feldern in Go kodieren und dekodieren
In Go umfasst die Arbeit mit JSON-Daten häufig die Kodierung und Dekodierung von Datenstrukturen und aus dem JSON-Format. Ein häufiges Szenario tritt auf, wenn versucht wird, als []Byte-Felder dargestellte Zeichenfolgen in JSON zu serialisieren.
Base64-Konvertierung durch json.Marshal()
Standardmäßig der JSON Die Methode .Marshal() behandelt []Byte-Felder speziell. Anstatt sie als Rohbytes zu serialisieren, werden sie als Base64-codierte Zeichenfolgen codiert. Diese Konvertierung ist notwendig, da JSON keine native Darstellung für Binärdaten hat.
Abweichungen von der erwarteten Ausgabe
Um dieses Verhalten zu veranschaulichen, betrachten Sie den folgenden Codeausschnitt:
<code class="go">package main import ( "fmt" "encoding/json" ) type Msg struct { Content []byte } func main() { helloStr := "Hello" helloSlc := []byte(helloStr) fmt.Println(helloStr, helloSlc) obj := Msg{helloSlc} json, _ := json.Marshal(obj) fmt.Println(string(json)) }</code>
Ausgabe:
Hello [72 101 108 108 111] {"Content":"SGVsbG8="}
Wie Sie sehen können, enthält die JSON-Zeichenfolge die Base64-codierte Version der „Hello“-Zeichenfolge anstelle der Originalzeichenfolge selbst.
Verstehen der Konvertierung
Der Grund für dieses Verhalten liegt in der JSON-Spezifikation. dem eine native Darstellung für Rohbytes fehlt. Durch die Base64-Codierung des []Byte-Felds gewährleistet json.Marshal() die Kompatibilität mit dem JSON-Format und bewahrt gleichzeitig die Integrität der Originaldaten.
Umgang mit benutzerdefinierter Codierung
Wenn Sie es vorziehen, die Rohbytes beizubehalten, anstatt sie mit Base64 zu kodieren, können Sie eine benutzerdefinierte Serialisierungs- und Deserialisierungslogik implementieren. Dies beinhaltet normalerweise das Überschreiben der Methoden MarshalJSON() und UnmarshalJSON() Ihrer Struktur.
Benutzerdefiniertes Marshalling-Beispiele:
<code class="go">func (m *Msg) MarshalJSON() ([]byte, error) { type Alias Msg return json.Marshal((*Alias)(m)) }</code>
<code class="go">func (m *Msg) UnmarshalJSON(b []byte) error { type Alias Msg var a Alias if err := json.Unmarshal(b, &a); err != nil { return err } *m = Msg(a) return nil }</code>
Das obige ist der detaillierte Inhalt vonWie gehen Sie mit []Byte-Feldern in Go um, wenn Sie JSON kodieren und dekodieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!