Isu Pengekodan Base64 dengan json.Marshal dan json.RawMessage
Dalam kod yang disediakan, json.Marshal digunakan pada json.RawMessage , yang bertujuan untuk mewakili data JSON sewenang-wenangnya. Walau bagaimanapun, output secara tidak dijangka dikodkan base64.
Masalah
Setelah disiasat, menjadi jelas bahawa kaedah MarshalJSON json.RawMessage hanya mengembalikan kepingan bait mesej, sebagai dilihat di sini:
// MarshalJSON returns *m as the JSON encoding of m. func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
Oleh itu, apabila json.Marshal dipanggil tanpa penunjuk ke RawMessage, ia tersilap menganggapnya sebagai []bait biasa, mengakibatkan pengekodan base64.
Penyelesaian
Seperti yang dicadangkan dalam benang go-nuts, penyelesaiannya terletak pada menyediakan penunjuk kepada json.RawMessage apabila menggunakan json.Marshal, sebagai ditunjukkan di bawah:
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)) }
Pendekatan ini sejajar dengan tingkah laku yang dijangkakan daripada json.Marshal, di mana ia menganggap bukan penunjuk untuk mewakili nilai bait mentah. Dengan memberikan penuding kepada RawMessage, ia mengecam mesej dengan betul sebagai nilai JSON dan menjadikannya sewajarnya.
Atas ialah kandungan terperinci Mengapakah json.RawMessage saya dikodkan base64 apabila menggunakan `json.Marshal`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!