gpt4 book ai didi

json - json.NewEncoder 和 json.NewDecoder 中的序列化/编码

转载 作者:行者123 更新时间:2023-12-01 21:17:25 25 4
gpt4 key购买 nike

我正在尝试通过在 Go 中使用 gorilla mux 库构建不同的基本 REST API 来学习后端开发(遵循 tutorial)
这是我到目前为止构建的代码:

package main

import (
"encoding/json"
"net/http"

"github.com/gorilla/mux"
)

// Post represents single post by user
type Post struct {
Title string `json:"title"`
Body string `json:"body"`
Author User `json:"author"`
}

// User is struct that represnets a user
type User struct {
FullName string `json:"fullName"`
Username string `json:"username"`
Email string `json:"email"`
}

var posts []Post = []Post{}

func main() {
router := mux.NewRouter()
router.HandleFunc("/posts", addItem).Methods("POST")
http.ListenAndServe(":5000", router)
}

func addItem(w http.ResponseWriter, req *http.Request) {
var newPost Post
json.NewDecoder(req.Body).Decode(&newPost)

posts = append(posts, newPost)

w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(posts)
}
但是,我对 json.NewDecoder 中到底发生了什么感到非常困惑。和 json.NewEncoder部分。
据我了解,最终以 REST API 通过 Internet 传输的数据将以字节/二进制格式(我猜是 UTF-8 编码?)的形式发生。所以 json.NewEncoder正在将 Go 数据结构转换为 JSON 字符串和 json.NewDecoder正在做相反的事情(如果我错了,请纠正我)。
  • 那么这里谁负责将这个 JSON 字符串转换为 UTF-8
    数据传输编码?这也是 json.NewDecoder 的一部分吗?和 json.NewEncoder做?
  • 另外,如果这两个函数只是序列化/反序列化
    到/从 JSON,为什么名称编码器和解码器(不是编码
    总是与二进制数据转换有关?)。老实说,我对 encoding 这些术语感到很困惑, serialization , marshaling以及它们之间的区别

  • 有人能解释一下每个转换级别(json、二进制、内存数据结构)的数据传输到底是如何发生的吗?

    最佳答案

    首先,我们要明白编码过程实际上并不意味着它翻译了types。并返回 type 的 JSON 表示.为您提供 JSON 表示的过程称为编码过程,可以通过调用 json.Marshal function 来完成。 .
    另一方面,Encoding过程意味着我们要获取任意type的JSON编码并将其写入(编码)到实现 io.Writer 接口(interface)的流上。正如我们所看到的 func NewEncoder(w io.Writer) *Encoder收到 io.Writer接口(interface)作为参数并返回 *json.Encoder目的。当方法encoder.Encode()被调用时,它会执行 Marshaling 过程,然后将结果写入我们在创建新 Encoder 对象时传递的 io.Writer 。你可以看到 json.Encoder.Encode() here 的实现.
    所以,如果你问谁对 http 流进行编码处理,答案是 http.ResponseWriter。 . ResponseWriter 实现了 io.Writer 接口(interface),当 Encode()方法被调用时,编码器会将对象编码为 JSON 编码表示,然后调用 func Write([]byte) (int, error)这是 io.Writer 接口(interface)的一个契约方法,它将对 http 流进行写入过程。
    总之,我可以说 Marshal 和 Unmarshal 意味着我们想要获得任何类型的 JSON 表示,反之亦然。而编码意味着我们要进行编码处理,然后将结果写入(编码)到任何流对象。而解码意味着我们想要从任何流中获取(解码)一个 json 对象,然后执行 Unmarshaling 过程。

    关于json - json.NewEncoder 和 json.NewDecoder 中的序列化/编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63475132/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com