json.Marshal 和json.RawMessage 的Base64 編碼問題
在提供的程式碼中,json.Marshal 應用於jawMessage旨在表示任意JSON 資料。然而,輸出意外地是 base64 編碼的。
問題
經過調查,很明顯json.RawMessage 的MarshalJSON 方法只是傳回訊息的位元組切片,如下所示看到這裡:
// MarshalJSON returns *m as the JSON encoding of m. func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
因此,當沒有指標呼叫json.Marshal 時對於RawMessage,它錯誤地將其視為普通的 []byte,從而導致採用 Base64 編碼。
解決方案
按照go-nuts 線程中的建議,解決方案在於調用json.Marshal時提供指向json.RawMessage的指針,如圖下面:
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)) }
這種方法與json.Marshal預期的行為一致,它假設非指標表示原始位元組值。透過提供指向 RawMessage 的指針,它可以正確地將訊息識別為 JSON 值並相應地呈現它。
以上是為什麼在使用「json.Marshal」時我的 json.RawMessage 被進行了 Base64 編碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!