Marshalling json.RawMessage: Mendedahkan Sebab Di Sebalik Pengekodan Base64
Dalam senario yang menarik ini, anda telah menghadapi tingkah laku yang tidak normal semasa cuba untuk marshal a json.RawMessage instance. Anehnya, daripada mendapatkan rentetan JSON yang tidak dikodkan yang dijangkakan, anda telah menemui versi yang dikodkan base64 dengan teliti. Untuk menyelesaikan teka-teki ini, mari kita menyelidiki kedalaman mekanik asas.
Adalah penting untuk menyedari bahawa apabila menggunakan fungsi Marshal pada json.RawMessage, faktor penting terletak pada memastikan nilai input berada dalam fakta penunjuk. Perbezaan yang nampaknya halus ini memainkan peranan penting dalam gelagat json.RawMessage.
Seperti yang anda nyatakan dengan betul, pelaksanaan json.RawMessage bagi MarshalJSON direka untuk hanya mengembalikan kepingan bait asas. Walau bagaimanapun, jika nilai input bukan penunjuk, fungsi Marshal secara automatik akan menggunakan pengekodan base64 pada kepingan bait sebelum mengeluarkannya.
Untuk membetulkan keadaan ini dan mendapatkan hasil yang diingini, penyelesaiannya semudah lulus penunjuk ke json.RawMessage anda. Dengan berbuat demikian, anda secara berkesan mengarahkan fungsi Marshal untuk beroperasi pada kepingan bait asas secara langsung, sekali gus memintas proses pengekodan base64 yang tidak diingini.
Pertimbangkan coretan kod yang diubah suai berikut:
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)) }
Oleh melaksanakan perubahan yang halus namun penting ini, anda kini boleh menjangka dengan yakin dengan jangkaan hasil:
{"foo":"bar"}
Kod yang diubah suai ini sejajar dengan keperluan fungsi Marshal untuk nilai input berasaskan penunjuk, dengan berkesan menghapuskan pengekodan base64 yang tidak diingini. Berbekalkan pengetahuan baharu ini, anda kini boleh menangani cabaran serupa dengan yakin dan memastikan gelagat penggabungan JSON yang diingini dalam aplikasi Go anda.
Atas ialah kandungan terperinci Mengapa Adakah `json.RawMessage` Saya Marshal sebagai Base64?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!