首页  >  文章  >  后端开发  >  为什么在使用“json.Marshal”时我的 json.RawMessage 被进行了 Base64 编码?

为什么在使用“json.Marshal”时我的 json.RawMessage 被进行了 Base64 编码?

Patricia Arquette
Patricia Arquette原创
2024-11-09 06:56:02514浏览

Why is my json.RawMessage being base64 encoded when using `json.Marshal`?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn