json.Marshal 和 json.RawMessage 的 Base64 编码问题
在提供的代码中,json.Marshal 应用于 json.RawMessage ,旨在表示任意 JSON 数据。然而,输出意外地是 base64 编码的。
问题
经过调查,很明显 json.RawMessage 的 MarshalJSON 方法只是返回消息的字节切片,如下所示看到这里:
// MarshalJSON returns *m as the JSON encoding of m. func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
因此,当在没有指向RawMessage的指针的情况下调用json.Marshal时,它会错误地将其视为普通的[]字节,从而导致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中文网其他相关文章!