Heim  >  Artikel  >  Backend-Entwicklung  >  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
DDDOriginal
2024-11-06 15:07:02344Durchsuche

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>

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!

Stellungnahme:
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