Marshalling von json.RawMessage: Enthüllung des Grundes hinter der Base64-Codierung
In diesem faszinierenden Szenario sind Sie beim Versuch, dies zu tun, auf ein ungewöhnliches Verhalten gestoßen Marshallen Sie eine json.RawMessage-Instanz. Überraschenderweise sind Sie nicht auf den erwarteten uncodierten JSON-String gestoßen, sondern auf eine sorgfältig Base64-codierte Version. Um dieses Rätsel zu lösen, tauchen wir in die Tiefen der zugrunde liegenden Mechanik ein.
Es ist wichtig zu erkennen, dass bei der Verwendung der Marshal-Funktion auf einer json.RawMessage der entscheidende Faktor darin liegt, sicherzustellen, dass der Eingabewert vorhanden ist Tatsache ein Hinweis. Diese scheinbar subtile Unterscheidung spielt eine entscheidende Rolle im Verhalten von json.RawMessage.
Wie Sie zu Recht betont haben, ist die Implementierung von MarshalJSON durch json.RawMessage so konzipiert, dass sie einfach das zugrunde liegende Byte-Slice zurückgibt. Wenn der Eingabewert jedoch kein Zeiger ist, wendet die Marshal-Funktion vor der Ausgabe automatisch die Base64-Codierung auf das Byte-Slice an.
Um diese Situation zu beheben und das gewünschte Ergebnis zu erhalten, ist die Lösung so einfach wie Übergeben ein Zeiger auf Ihre json.RawMessage. Auf diese Weise weisen Sie die Marshal-Funktion effektiv an, das zugrunde liegende Byte-Slice direkt zu bearbeiten und so den unerwünschten Base64-Kodierungsprozess zu umgehen.
Bedenken Sie den folgenden modifizierten Codeausschnitt:
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(&raw) // Pass a pointer to json.RawMessage if err != nil { panic(err) } fmt.Println(string(j)) }
Von Wenn Sie diese subtile, aber wesentliche Änderung implementieren, können Sie jetzt sicher das erwartete Ergebnis vorhersehen:
{"foo":"bar"}
Dieser geänderte Code entspricht den Anforderungen der Marshal-Funktion an zeigerbasierten Eingabewerten und eliminiert so effektiv die unerwünschte Base64-Codierung. Ausgestattet mit diesem neu gewonnenen Wissen können Sie nun ähnliche Herausforderungen sicher angehen und das gewünschte JSON-Marshalling-Verhalten in Ihren Go-Anwendungen sicherstellen.
Das obige ist der detaillierte Inhalt vonWarum wird mein „json.RawMessage' als Base64 gemarshallt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!