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

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

Patricia Arquette
发布: 2024-11-09 06:56:02
原创
568 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板