Apabila memanggil json.Marshal dengan nilai json.RawMessage, hasilnya adalah tidak dijangka. Daripada rentetan JSON yang dikehendaki, rentetan yang dikodkan base64 dikembalikan.
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==" }
Isunya terletak pada penggunaan json.RawMessage dalam json.Marshal. Jenis json.RawMessage, yang direka untuk menyimpan data JSON mentah tanpa menyahkodnya, mempunyai kaedah MarshalJSON yang hanya mengembalikan kepingan bait.
func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
Walau bagaimanapun, agar json.Marshal berfungsi dengan betul dengan json.RawMessage, nilai yang diluluskan mestilah penunjuk kepada contoh json.RawMessage.
j, err := json.Marshal(&raw)
Dengan menghantar penunjuk kepada json.RawMessage, kaedah MarshalJSON digunakan pada penunjuk, memastikan bahawa kepingan bait dikembalikan tanpa base64 pengekodan.
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"}" }
Atas ialah kandungan terperinci Mengapakah json.Marshal dengan json.RawMessage mengembalikan rentetan berkod Base64?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!