Heim > Artikel > Backend-Entwicklung > Warum gibt json.Marshal mit json.RawMessage eine Base64-codierte Zeichenfolge zurück?
Beim Aufruf von json.Marshal mit einem json.RawMessage-Wert ist das Ergebnis unerwartet. Anstelle des gewünschten JSON-Strings wird ein Base64-codierter String zurückgegeben.
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(raw) if err != nil { panic(err) } fmt.Println(string(j)) // Output: "eyJmb28iOiJiYXIifQ==" }
Das Problem liegt in der Verwendung von json.RawMessage in json.Marshal. Der Typ json.RawMessage, der zum Speichern von JSON-Rohdaten ohne Decodierung entwickelt wurde, verfügt über eine MarshalJSON-Methode, die einfach das Byte-Slice zurückgibt.
func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
Damit json.Marshal jedoch ordnungsgemäß mit json.RawMessage funktioniert, Der übergebene Wert muss ein Zeiger auf die json.RawMessage-Instanz sein.
j, err := json.Marshal(&raw)
Durch die Übergabe eines Zeigers an json.RawMessage wird die MarshalJSON-Methode auf dem Zeiger aufgerufen, um sicherzustellen, dass das Byte-Slice ohne Base64 zurückgegeben wird Kodierung.
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(&raw) if err != nil { panic(err) } fmt.Println(string(j)) // Output: "{"foo":"bar"}" }
Das obige ist der detaillierte Inhalt vonWarum gibt json.Marshal mit json.RawMessage eine Base64-codierte Zeichenfolge zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!