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