使用 json.RawMessage 值呼叫 json.Marshal 時,結果是意外的。傳回的是 Base64 編碼的字串,而不是所需的 JSON 字串。
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==" }
問題在於 json.Marshal 中 json.RawMessage 的使用。 json.RawMessage 類型旨在儲存原始 JSON 資料而不對其進行解碼,它有一個僅傳回位元組切片的 MarshalJSON 方法。
func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
但是,為了使 json.Marshal 能夠與 json.RawMessage 一起正確運行,傳遞的值必須是指向 json.RawMessage 實例的指標。
j, err := json.Marshal(&raw)
透過將指標傳遞給json.RawMessage,在指標上呼叫MarshalJSON方法,確保傳回的位元組切片沒有base64編碼。
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"}" }
以上是為什麼 json.Marshal 和 json.RawMessage 回傳 Base64 編碼的字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!