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