在 Golang,json 编码和编组的区别是什么

JSON 的“编码/解码”和 JSON 的“编组/解组”有什么区别?

试图学习如何在 golang 中编写 RESTFUL api,但是不确定 JSON“编码”和“编组”之间的区别是什么,或者它们是否相同?

33347 次浏览

通常,编码/解码 JSON是指实际读取/写入字符数据到字符串或二进制形式的过程。封送处理/解封送处理是指将 JSON类型与 Go数据类型和基元映射的过程。

例如,实际的编码可以包括序列化 unicode 字符之类的内容。我认为它们在文档中有时可以互换使用,因为它们通常出现在同一个步骤中。例如,Marshall 函数将确定将某些内容封送到哪个 JSON 类型,然后将其编码为字符串形式(如果其文本数据为特殊字符,则可能包括其他细节)。

有关 调度/解散步骤如何工作的更多细节,您可以参考 go json 包文档。

Func Encode 是 Encoder 上的一个方法,它将 JSON 编码的 Go 类型写入输出流(func NewEncoder 采用 io。并返回 * 编码器)。

您的 Go 类型输入黑盒,并以 JSON 格式写入流。

Marshall 是一个返回 Go 类型的 JSON 编码的函数。

在这里,您的 Go 类型输入黑盒,然后以 JSON 格式从黑盒中出来。

详细记录如下: Golang.org/pkg/encoding/json/

  • Marshall = > String
  • 编码 = > 数据流

元组和解组将字符串转换为 JSON,反之亦然。 编码和解码将流转换为 JSON,反之亦然。

下面的代码显示了编组和解组的工作

type Person struct {
First string
Last string
}
func main() {
/* This will marshal the JSON into []bytes */


p1 := Person{"alice", "bob"}
bs, _ := json.Marshal(p1)
fmt.Println(string(bs))


/* This will unmarshal the JSON from []bytes */


var p2 Person
bs = []byte(`{"First":"alice","Last":"bob"}`)
json.Unmarshal(bs, &p2)
fmt.Println(p2)


}

编码器和解码器编写结构来切割流或从流的切片读取数据并将其转换为结构。在内部,它还实现了封送处理方法。唯一的区别是,如果你想玩字符串或字节使用封送处理,如果任何数据你想读或写到一些编写器接口,使用编码和解码。

JSON 的“编码/解码”和 JSON 的“编组/解组”有什么区别?


封送处理 编码中当然是不同的概念,最好在 Wikipedia (或其他地方)上解决。但是简而言之,对象被封送到 JSON 编码的字符串中。

也不要让 Golang 的 json.NewEncoder/(json.Encoder).Encodejson.Marshal方法迷惑你。它们都将对象封送到 JSON 编码的字符串中。区别在于编码器,首先将对象封送到 JSON 编码的字符串,然后将该数据写入缓冲区流(或 Wikipedia 上的 数据缓冲区)。因此,编码器比较简单的 json.Marshal使用更多的代码和内存开销。

你也可以在 Golang 源代码中看到:

通常,如果需要将 JSON 编码的字符串发送到文件系统,或作为 HTTP 响应,则可能需要使用缓冲区流。但是,您也可以使用 烟斗在没有缓冲区流的情况下发送这个 JSON 编码的字符串。

这些方法之间没有太大的区别,更多的是取决于你的使用, 如果你有的话。阅读器(例如: 当您使用 HTTP 或文件系统时) ,使用 NewDecder 更容易:

json.NewDecoder go standard lib

它给出 io.Reader 并返回 * 解码器类型, 然后将一个 Decode 方法链接到它:

json.Decode go standard lib

这个 Decode 方法将把数据写入 v,并将它作为参数传递给 v。

另一方面

解组方法将帮助您轻松地将字符串化的 JSON 转换为 Go 数据类型(主要是结构和映射)

json.Unmarshal go standard lib

有关详细信息,请参阅文档:

Https://golang.org/pkg/encoding/json/#unmarshal

Https://golang.org/pkg/encoding/json/#newdecoder

Https://golang.org/pkg/encoding/json/#decoder 解码

尽管有一些很好的答案。我想把 Encoding/decodingMarshaling/Unmarshaling之间的区别总结如下。还有一些情况下,可以使用 Encoding/decoding,否则,可以使用 Marshaling/Unmarshaling

  • Encoding/decoding JSON 指的是实际读/写字符数据到字符串或二进制形式的过程。

    • 在处理请求或响应主体时使用 NewEncoder,因为它们是 Reader,它节省了将其转换为字节数组以便与 Marshal一起使用的步骤
    • 编码器还为您提供了一些额外的控制,比如能够在未知字段上发生错误,而 json.Unmarshal不会这样做。
    • 如果您希望在某些情况下缩进 JSON (例如通过配置) ,那么可以使用 SetIndent(true)。此外,json.Encoder还有 SetEscapeHTML选项
  • Marshaling/Unmarshaling指的是将 JSON 类型从数据类型和原语映射到 Go 数据类型和原语。

来源 1 2