首頁 > 後端開發 > Golang > 主體

為什麼 json.Marshal 和 json.RawMessage 回傳 Base64 編碼的字串?

Mary-Kate Olsen
發布: 2024-11-12 08:04:02
原創
458 人瀏覽過

Why does json.Marshal with json.RawMessage return a Base64 encoded string?

編組 json.RawMessage 回傳 Base64 編碼字串

使用 json.RawMessage 值呼叫 json.Marshal 時,結果是意外的。傳回的是 Base64 編碼的字串,而不是所需的 JSON 字串。

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(raw)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  // Output: "eyJmb28iOiJiYXIifQ=="
}
登入後複製

問題在於 json.Marshal 中 json.RawMessage 的使用。 json.RawMessage 類型旨在儲存原始 JSON 資料而不對其進行解碼,它有一個僅傳回位元組切片的 MarshalJSON 方法。

func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil
}
登入後複製

但是,為了使 json.Marshal 能夠與 json.RawMessage 一起正確運行,傳遞的值必須是指向 json.RawMessage 實例的指標。

j, err := json.Marshal(&raw)
登入後複製

透過將指標傳遞給json.RawMessage,在指標上呼叫MarshalJSON方法,確保傳回的位元組切片沒有base64編碼。

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(&raw)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  // Output: "{"foo":"bar"}"
}
登入後複製

以上是為什麼 json.Marshal 和 json.RawMessage 回傳 Base64 編碼的字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板