在Golang中,json编码和编组之间有什么区别

Sco*_*ott 35 go

JSON'编码/解码'和JSON'编组/解组'之间有什么区别?

试着学习如何在golang中编写RESTFUL api并且不确定JSON'encoding'和'marshalling'之间的区别是什么?或者它们是否相同?

vin*_*rod 33

  • Marshal => String
  • Encode => Stream

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)

}
Run Code Online (Sandbox Code Playgroud)

编码器和解码器将结构写入流的切片或从流的切片读取数据并将其转换为结构.在内部,它还实现了编组方法.唯一的区别是如果您想使用字符串或字节使用marshal,并且如果您想要读取或写入某些编写器接口的任何数据,请使用编码和解码.


tfm*_*gue 12

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


编组编码当然是不同的概念,在维基百科(或其他地方)上更好地解决。但简而言之,对象被编组为 JSON 编码的字符串。

也不要让 Golang json.NewEncoder/(json.Encoder).Encodejson.Marshal方法混淆你。它们都将对象编组为 JSON 编码的字符串。不同之处在于编码器,首先将对象编组为 JSON 编码的字符串,然后将该数据写入缓冲区流(或维基百科上的数据缓冲区)。因此,编码器比简单的json.Marshal.

您还可以在 Golang 源代码中看到这一点:

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

  • @Arsham - 这里的“流”意味着放入缓冲流中,很抱歉造成混乱,我已经更新了我的问题的语言。即使您逐块流式传输 JSON 编码字符串,您仍然需要整个编码字符串完成流式传输,然后才能解组。 (2认同)

lee*_*eor 8

通常,编码/解码JSON是指实际读取/写入字符数据为字符串或二进制形式的过程.Marshaling/Unmarshaling是指JSONGo数据类型和基元映射类型的过程.

实际编码可以包括例如序列化unicode字符.我认为它们在文档中可能会有些互换使用,因为它们通常出现在同一步骤中.例如,Marshal函数将确定要编组内容的JSON类型,然后它将以字符串形式编码(可能包括其他详细信息,如特殊字符,如果其文本数据).

有关编组/解组步骤如何工作的更多详细信息,请参阅go json软件包文档.