Go 中使用[]byte 欄位對JSON 進行編碼和解碼
在Go 中,處理JSON 資料通常涉及對資料結構進行編碼和解碼以及JSON 格式。嘗試將 []byte 欄位表示的字串序列化為 JSON 時會遇到常見情況。
透過 json.Marshal() 進行 Base64 轉換
預設情況下,json .Marshal() 方法特殊對待 []byte 欄位。它將它們編碼為 base64 編碼的字串,而不是將它們序列化為原始位元組。此轉換是必要的,因為 JSON 沒有二進位資料的本機表示形式。
與預期輸出的偏差
要說明此行為,請考慮以下代碼片段:
<code class="go">package main import ( "fmt" "encoding/json" ) type Msg struct { Content []byte } func main() { helloStr := "Hello" helloSlc := []byte(helloStr) fmt.Println(helloStr, helloSlc) obj := Msg{helloSlc} json, _ := json.Marshal(obj) fmt.Println(string(json)) }</code>
輸出:
Hello [72 101 108 108 111] {"Content":"SGVsbG8="}
如您所見,JSON 字串包含「Hello」字串的Base64編碼版本,而不是原始字串本身。
理解轉換
此行為的原因根源於 JSON 規範,該規範缺乏原始位元組的本機表示。透過對 []byte 欄位進行 Base64 編碼,json.Marshal() 確保與 JSON 格式的兼容性,同時保留原始資料的完整性。
處理自訂編碼
如果您喜歡保留原始位元組而不是對其進行Base64 編碼,則可以實現自訂序列化和反序列化邏輯。這通常涉及重寫結構體的 MarshalJSON() 和 UnmarshalJSON() 方法。
自訂封送範例:
<code class="go">func (m *Msg) MarshalJSON() ([]byte, error) { type Alias Msg return json.Marshal((*Alias)(m)) }</code>
<code class="go">func (m *Msg) UnmarshalJSON(b []byte) error { type Alias Msg var a Alias if err := json.Unmarshal(b, &a); err != nil { return err } *m = Msg(a) return nil }</code>
以上是在編碼和解碼 JSON 時,如何處理 Go 中的 []byte 欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!