使用 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中文网其他相关文章!