JSON'编码/解码'有什么区别?和JSON'编组/解组'?
尝试学习如何在golang中编写RESTFUL api,而不确定JSON'编码'之间的区别。和'编组'是或如果它们是相同的?
答案 0 :(得分:26)
Marshal和Unmarshal将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)
}
编码器和解码器将结构写入流的切片或从流的切片读取数据并将其转换为结构。在内部,它还实现了编组方法。唯一的区别是如果你想使用字符串或字节使用marshal,如果你想读取或写入某些编写器接口的任何数据,请使用编码和解码。
答案 1 :(得分:7)
通常,编码/解码JSON
是指实际读取/写入字符数据为字符串或二进制形式的过程。 Marshaling / Unmarshaling是指将JSON
类型映射到Go
数据类型和基元的过程。
实际编码可以包括例如序列化unicode字符之类的内容。我认为它们在文档中可能会有些互换使用,因为它们通常出现在同一步骤中。例如,Marshal函数将确定要编组内容的JSON类型,然后它将以字符串形式编码(可能包括其他详细信息,如特殊字符,如果其文本数据)。
您可以参阅go json软件包文档,详细了解marshaling / unmarshaling步骤的工作原理。
答案 2 :(得分:4)
JSON“编码/解码”和JSON“编组/解组”有什么区别?
Marshaling和Encoding当然是不同的概念,可以在Wikipedia(或其他地方)更好地解决。简而言之,对象将编组为JSON编码的字符串。
也不要让Golang json.Marshal
和json.NewEncoder
/ (json.Encoder).Encode
方法使您感到困惑。他们都将对象编组为JSON编码的字符串。
大致的区别在于:
(json.Encoder).Encode
= json.Marshal
+流式传输
这是Marshal
的更高级版本,它使用更多的开销(代码和内存),因为它先调度,然后流输出。
您可以在源代码中看到它。
如果要使用流,请使用(json.Encoder).Encode
,否则请使用json.Marshal
。
答案 3 :(得分:0)
func Encode是Encoder上的一种方法,它将JSON编码的Go类型写入输出流(func NewEncoder接受io.Writer并返回* Encoder)。
您的Go类型进入黑盒子并以JSON格式写出到流中。
Marshal是一个返回Go类型的JSON编码的函数。
此处你的Go类型进入黑盒子并以JSON格式开箱即用。
它有很好的记录: golang.org/pkg/encoding/json/
答案 4 :(得分:0)
这些方法之间没有太大区别,更多的是取决于您的使用情况, 如果您有 io.Reader(例如:当您使用 HTTP 或文件系统时),则使用 NewDecoder 会更容易:
它给出 io.Reader 并返回 *Decoder 类型, 然后你将一个 Decode 方法链接到它:
这个 Decode 方法会将你作为参数传递给它的数据写入 v。
Unmarshal 方法将帮助您轻松地将字符串化的 JSON 转换为 Go 数据类型(主要是结构和映射)
有关更多详细信息,您可以阅读文档:
https://golang.org/pkg/encoding/json/#Unmarshal