首頁  >  文章  >  後端開發  >  在編碼和解碼 JSON 時,如何處理 Go 中的 []byte 欄位?

在編碼和解碼 JSON 時,如何處理 Go 中的 []byte 欄位?

DDD
DDD原創
2024-11-06 15:07:02350瀏覽

How do you handle []byte fields in Go when encoding and decoding JSON?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn