亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

json.NewEncoder 和 json.NewDecoder 中的序列化/編碼

json.NewEncoder 和 json.NewDecoder 中的序列化/編碼

Go
UYOU 2022-06-27 09:20:18
我正在嘗試通過在 Go 中使用 gorilla mux 庫構建一個不同的基本 REST API 來學習后端開發(遵循本教程)這是我到目前為止構建的代碼:package mainimport ("encoding/json""net/http""github.com/gorilla/mux")// Post represents single post by usertype Post struct {Title  string `json:"title"`Body   string `json:"body"`Author User   `json:"author"`}// User is struct that represnets a usertype 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以及它們之間的區別感到很困惑serializationmarshaling有人能解釋一下每個轉換級別(json、二進制、內存數據結構)的數據傳輸到底是如何發生的嗎?
查看完整描述

2 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

首先,我們必須了解編碼過程實際上并不意味著它會翻譯types并返回 a 的 JSON 表示type。為您提供 JSON 表示的過程稱為編組過程,可以通過調用json.Marshal 函數來完成。

另一方面,Encoding過程意味著我們想要獲取 any 的 JSON 編碼type并將其寫入(編碼)到實現 io.Writer 接口的流上。正如我們所見,func NewEncoder(w io.Writer) *Encoder接收一個io.Writer接口作為參數并返回一個*json.Encoder對象。調用該方法時encoder.Encode(),它會執行 Marshaling 過程,然后將結果寫入我們在創建新 Encoder 對象時傳遞的 io.Writer 中。你可以在這里看到 json.Encoder.Encode() 的實現。

所以,如果你問是誰對 http 流進行編碼處理,答案是http.ResponseWriter. ResponseWriter 實現了 io.Writer 接口,在Encode()調用該方法時,編碼器會將對象編組為 JSON 編碼表示,然后調用func Write([]byte) (int, error)io.Writer 接口的一個契約方法,它會對http 流。

總之,我可以說 Marshal 和 Unmarshal 意味著我們想要獲得任何類型的 JSON 表示,反之亦然。而編碼意味著我們要進行編組處理,然后將結果寫入(編碼)到任何流對象。而解碼意味著我們想要從任何流中獲取(解碼)一個 json 對象,然后執行 Unmarshaling 過程。


查看完整回答
反對 回復 2022-06-27
?
達令說

TA貢獻1821條經驗 獲得超6個贊

  1. json.Encoder調用產生的json.NewEncoder直接以 UTF-8 產生其輸出。無需轉換。(事實上,Go 沒有與 UTF-8 編碼的字節序列不同的文本數據表示形式——即使 astring只是底層的不可變字節數組。)

  2. Go 使用術語編碼進行序列化和解碼用于反序列化,無論序列化形式是二進制形式還是文本形式。不要過多考慮術語——將encodeseralise視為同義詞。


查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 859 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號