JSON“编码/解码”和JSON“编组/解组”有什么区别?
尝试学习如何在 golang 中编写 RESTFUL api,但不确定 JSON“编码”和“编组”之间的区别是什么,或者它们是否相同?
元帅 => 字符串
编码 => 流
Marshal 和 Unmarshal 将字符串转换为 JSON,反之亦然。编码和解码将流转换为 JSON,反之亦然。
下面的代码显示了 marshal 和 unmarshal 的工作
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)
}
编码器和解码器将结构写入流的切片或从流的切片中读取数据并将其转换为结构。在内部,它还实现了 marshal 方法。唯一的区别是,如果你想使用字符串或字节使用编组,如果你想读取或写入某些写入器接口的任何数据,请使用编码和解码。
通常,编码/解码JSON
是指将字符数据实际读/写成字符串或二进制形式的过程。编组/解组是指将 JSON
类型与 Go
数据类型和原语进行映射的过程。
实际编码可以包括诸如序列化 unicode 字符之类的东西。我认为它们有时可以在文档中互换使用,因为它们通常发生在同一步骤中。例如, Marshal 函数将确定将某些内容编组为哪种 JSON 类型,然后将其编码为字符串形式(如果其文本数据可能包括其他详细信息,例如特殊字符)。
有关 marshaling/unmarshaling 步骤如何工作的更多详细信息,您可以查阅 go json 包文档。
JSON“编码/解码”和JSON“编组/解组”有什么区别?
Marshaling 和 Encoding 当然是不同的概念,最好在 Wikipedia(或其他地方)上找到。但简而言之,对象被编组为 JSON 编码字符串。
也不要让 Golang json.NewEncoder
/ (json.Encoder).Encode
和 json.Marshal
方法让您感到困惑。它们都将对象编组为 JSON 编码的字符串。不同之处在于编码器,首先将对象编组为 JSON 编码字符串,然后将该数据写入缓冲区流(或 Wikipedia 上的 Data Buffer)。因此,编码器比更简单的 json.Marshal
使用更多的代码和内存开销。
您还可以在 Golang 源代码中看到这一点:
元帅:https://golang.org/src/encoding/json/encode.go?s=6458:6501#L148
编码:https://golang.org/src/encoding/json/stream.go?s=5070:5117#L191
通常,如果您需要将 JSON 编码的字符串发送到文件系统,或者作为 HTTP 响应,您可能需要使用缓冲流。但是,您也可以使用 pipe 发送此 JSON 编码字符串而无需缓冲流。
func Encode 是 Encoder 上的一个方法,它将 JSON 编码的 Go 类型写入输出流(func NewEncoder 接受一个 io.Writer 并返回一个 *Encoder)。
您的 Go 类型进入黑匣子,并以 JSON 格式写入流中。
Marshal 是一个返回 Go 类型的 JSON 编码的函数。
在这里,您的 Go 类型进入黑盒并以 JSON 格式开箱即用。
详细记录在:golang.org/pkg/encoding/json/
这些方法并没有太大区别,更多的是取决于你的使用,如果你有 io.Reader(例如:当你使用 HTTP 或文件系统时),使用 NewDecoder 会更容易:
https://i.stack.imgur.com/QcOyh.png
它提供 io.Reader 并返回 *Decoder 类型,然后将 Decode 方法链接到它:
https://i.stack.imgur.com/kYFcG.png
并且此 Decode 方法会将数据写入您作为参数传递给它的 v。
另一方面
Unmarshal 方法将帮助您轻松地将字符串化 JSON 转换为 Go 数据类型(主要是结构和映射)
https://i.stack.imgur.com/kW8ew.png
有关更多详细信息,您可以阅读文档:
https://golang.org/pkg/encoding/json/#Unmarshal
https://golang.org/pkg/encoding/json/#NewDecoder
https://golang.org/pkg/encoding/json/#Decoder.Decode
虽然有一些很好的答案。我想将 Encoding/decoding
和 Marshaling/Unmarshaling
之间的区别总结如下。此外,在某些情况下,您可以使用 Encoding/decoding
,否则,可以使用 Marshaling/Unmarshaling
。
编码/解码 JSON 是指将字符数据实际读/写成字符串或二进制形式的过程。在处理请求或响应主体时使用 NewEncoder,因为它们是 Readers,它可以节省您将其转换为字节数组以与 Marshal 一起使用的步骤。 Unmarshal 不这样做。如果在某些情况下需要缩进 JSON(例如通过配置),则可以 SetIndent(true)。此外, json.Encoder 具有 SetEscapeHTML 选项
在处理请求或响应主体时使用 NewEncoder,因为它们是 Readers,它可以节省您将其转换为字节数组以与 Marshal 一起使用的步骤
编码器还为您提供了一些额外的控制,例如能够在未知字段上出错,而 json.Unmarshal 不会这样做。
如果在某些情况下需要缩进 JSON(例如通过配置),则可以 SetIndent(true)。此外, json.Encoder 具有 SetEscapeHTML 选项
编组/解组是指将 JSON 类型与 Go 数据类型和原语进行映射。