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

Mary-Kate Olsen
Freigeben: 2024-11-06 11:04:02
Original
201 Leute haben es durchsucht

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

Erzeugt den JSON-String:

{"Content":"SGVsbG8="}
Nach dem Login kopieren

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!