首頁  >  文章  >  後端開發  >  將 Go 結構中的「[]byte」欄位編組為 JSON 時如何保留原始字串內容?

將 Go 結構中的「[]byte」欄位編組為 JSON 時如何保留原始字串內容?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-06 11:04:02192瀏覽

How to Preserve Original String Content When Marshaling a `[]byte` Field in a Go Struct as JSON?

將JSON []byte 編組為字串

問題:

問題:
type Msg struct {
    Content []byte
}

func main() {
    helloStr := "Hello"
    helloSlc := []byte(helloStr)
    json, _ := json.Marshal(Msg{helloSlc})
    fmt.Println(string(json))
}

在Go 中,編碼時包含JSON 形式的[]byte 欄位的結構體,產生的JSON 包含切片內容的非預期字串表示形式。例如,程式碼:
{"Content":"SGVsbG8="}

產生JSON 字串:

json.Marshal 對切片內容進行了哪些轉換,原始字串內容如何

答案:

Base64 編碼

預設情況下,Go 的json.Marshal 函數將[]byte 數組編碼為用於表示JSON 中原始表示JSON 中原始表示JSON位元組的base64 編碼字串。根據 JSON 規範,JSON 沒有原始位元組的本機表示。

自訂封送處理:
import (
    "encoding/json"
    "fmt"
)

type Msg struct {
    Content []byte
}

func (m Msg) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf(`{"Content": "%s"}`, m.Content)), nil
}

func main() {
    helloStr := "Hello"
    helloSlc := []byte(helloStr)
    json, _ := json.Marshal(Msg{helloSlc})
    fmt.Println(string(json))
}

要保留原始字串內容,可以使用自訂封送處理透過為Msg 結構定義自訂MarshalJSON 方法來實現: 此自訂實作將Content 欄位編碼為JSON 物件中的字串,保留其原始內容。

以上是將 Go 結構中的「[]byte」欄位編組為 JSON 時如何保留原始字串內容?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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