Heim > Backend-Entwicklung > Golang > Wie gehen Sie mit []Byte-Feldern in Go um, wenn Sie JSON kodieren und dekodieren?

Wie gehen Sie mit []Byte-Feldern in Go um, wenn Sie JSON kodieren und dekodieren?

DDD
Freigeben: 2024-11-06 15:07:02
Original
460 Leute haben es durchsucht

How do you handle []byte fields in Go when encoding and decoding JSON?

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

Ausgabe:

Hello [72 101 108 108 111]
{"Content":"SGVsbG8="}
Nach dem Login kopieren

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage