首页  >  文章  >  后端开发  >  为什么我的'json.RawMessage”编组为 Base64?

为什么我的'json.RawMessage”编组为 Base64?

Susan Sarandon
Susan Sarandon原创
2024-11-09 21:35:02494浏览

Why Does My `json.RawMessage` Marshal as Base64?

编组 json.RawMessage:揭示 Base64 编码背后的原因

在这个有趣的场景中,您在尝试执行以下操作时遇到了异常行为编组 json.RawMessage 实例。令人惊讶的是,您没有获得预期的未编码 JSON 字符串,而是遇到了精心设计的 Base64 编码版本。为了解开这个谜团,让我们深入研究底层机制。

必须认识到,在 json.RawMessage 上使用 Marshal 函数时,关键因素在于确保输入值位于事实上是一个指针。这种看似微妙的区别在 json.RawMessage 的行为中起着关键作用。

正如您正确指出的那样,json.RawMessage 的 MarshalJSON 实现旨在简单地返回底层字节切片。但是,如果输入值不是指针,Marshal 函数会在输出之前自动对字节切片应用 Base64 编码。

要纠正这种情况并获得所需的结果,解决方案很简单,只需传递指向 json.RawMessage 的指针。通过这样做,您可以有效地指示 Marshal 函数直接对底层字节切片进行操作,从而绕过不需要的 Base64 编码过程。

考虑以下修改后的代码片段:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(&raw) // Pass a pointer to json.RawMessage
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))
}

通过实施这一微妙但重要的更改后,您现在可以自信地预期预期结果:

{"foo":"bar"}

此修改后的代码符合 Marshal 函数对基于指针的输入值的要求,有效消除了不需要的 Base64 编码。有了这些新发现的知识,您现在可以自信地应对类似的挑战,并确保 Go 应用程序中实现所需的 JSON 编组行为。

以上是为什么我的'json.RawMessage”编组为 Base64?的详细内容。更多信息请关注PHP中文网其他相关文章!

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