首頁  >  文章  >  後端開發  >  為什麼在使用「json.Marshal」時我的 json.RawMessage 被進行了 Base64 編碼?

為什麼在使用「json.Marshal」時我的 json.RawMessage 被進行了 Base64 編碼?

Patricia Arquette
Patricia Arquette原創
2024-11-09 06:56:02511瀏覽

Why is my json.RawMessage being base64 encoded when using `json.Marshal`?

json.Marshal 和json.RawMessage 的Base64 編碼問題

在提供的程式碼中,json.Marshal 應用於jawMessage旨在表示任意JSON 資料。然而,輸出意外地是 base64 編碼的。

問題

經過調查,很明顯json.RawMessage 的MarshalJSON 方法只是傳回訊息的位元組切片,如下所示看到這裡:

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil 
}

因此,當沒有指標呼叫json.Marshal 時對於RawMessage,它錯誤地將其視為普通的 []byte,從而導致採用 Base64 編碼。

解決方案

按照go-nuts 線程中的建議,解決方案在於調用json.Marshal時提供指向json.RawMessage的指針,如圖下面:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(&raw) // Pass pointer to RawMessage
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  
}

這種方法與json.Marshal預期的行為一致,它假設非指標表示原始位元組值。透過提供指向 RawMessage 的指針,它可以正確地將訊息識別為 JSON 值並相應地呈現它。

以上是為什麼在使用「json.Marshal」時我的 json.RawMessage 被進行了 Base64 編碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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