Heim > Artikel > Backend-Entwicklung > Warum ist meine json.RawMessage base64-codiert, wenn ich „json.Marshal“ verwende?
Base64-Kodierungsproblem mit json.Marshal und json.RawMessage
Im bereitgestellten Code wird json.Marshal auf eine json.RawMessage angewendet , das beliebige JSON-Daten darstellen soll. Allerdings ist die Ausgabe unerwarteterweise Base64-codiert.
Problem
Bei der Untersuchung wird deutlich, dass die MarshalJSON-Methode von json.RawMessage einfach das Byte-Slice der Nachricht zurückgibt, als hier zu sehen:
// MarshalJSON returns *m as the JSON encoding of m. func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
Wenn daher json.Marshal ohne einen Zeiger auf die RawMessage aufgerufen wird, wird es fälschlicherweise als gewöhnliches []Byte behandelt, was zu einer Base64-Codierung führt.
Lösung
Wie im Go-Nuts-Thread vorgeschlagen, besteht die Lösung darin, beim Aufruf von json.Marshal einen Zeiger auf die json.RawMessage bereitzustellen, wie unten gezeigt:
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(&raw) // Pass pointer to RawMessage if err != nil { panic(err) } fmt.Println(string(j)) }
Dieser Ansatz entspricht dem von json.Marshal erwarteten Verhalten, bei dem davon ausgegangen wird, dass Nichtzeiger rohe Bytewerte darstellen. Durch die Bereitstellung eines Zeigers auf RawMessage wird die Nachricht korrekt als JSON-Wert erkannt und entsprechend gerendert.
Das obige ist der detaillierte Inhalt vonWarum ist meine json.RawMessage base64-codiert, wenn ich „json.Marshal“ verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!