Heim  >  Artikel  >  Backend-Entwicklung  >  Wie bleibt der ursprüngliche String-Inhalt erhalten, wenn ein „[]Byte“-Feld in einer Go-Struktur als JSON gemarshallt wird?

Wie bleibt der ursprüngliche String-Inhalt erhalten, wenn ein „[]Byte“-Feld in einer Go-Struktur als JSON gemarshallt wird?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-06 11:04:02192Durchsuche

How to Preserve Original String Content When Marshaling a `[]byte` Field in a Go Struct as JSON?

Marshaling von JSON []Byte als Strings

Frage:

In Go, beim Codieren Eine Struktur, die ein []Byte-Feld als JSON enthält. Das resultierende JSON enthält eine nicht erwartete Zeichenfolgendarstellung des Slice-Inhalts. Zum Beispiel der Code:

type Msg struct {
    Content []byte
}

func main() {
    helloStr := "Hello"
    helloSlc := []byte(helloStr)
    json, _ := json.Marshal(Msg{helloSlc})
    fmt.Println(string(json))
}

Erzeugt den JSON-String:

{"Content":"SGVsbG8="}

Welche Konvertierung wird von json.Marshal für den Slice-Inhalt durchgeführt und wie kann der ursprüngliche String-Inhalt aussehen? erhalten?

Antwort:

Base64-Kodierung

Standardmäßig kodiert die json.Marshal-Funktion von Go []Byte-Arrays als Base64-codierte Zeichenfolgen zur Darstellung von Rohbytes in JSON. Gemäß der JSON-Spezifikation verfügt JSON nicht über eine native Darstellung für Rohbytes.

Benutzerdefiniertes Marshalling:

Um den ursprünglichen String-Inhalt beizubehalten, kann benutzerdefiniertes Marshalling verwendet werden implementiert durch Definieren einer benutzerdefinierten MarshalJSON-Methode für die Msg-Struktur:

import (
    "encoding/json"
    "fmt"
)

type Msg struct {
    Content []byte
}

func (m Msg) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf(`{"Content": "%s"}`, m.Content)), nil
}

func main() {
    helloStr := "Hello"
    helloSlc := []byte(helloStr)
    json, _ := json.Marshal(Msg{helloSlc})
    fmt.Println(string(json))
}

Diese benutzerdefinierte Implementierung codiert das Inhaltsfeld als Zeichenfolge innerhalb des JSON-Objekts und behält seinen ursprünglichen Inhalt bei.

Das obige ist der detaillierte Inhalt vonWie bleibt der ursprüngliche String-Inhalt erhalten, wenn ein „[]Byte“-Feld in einer Go-Struktur als JSON gemarshallt wird?. 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