Mengapakah json.Marshal dengan json.RawMessage mengembalikan rentetan berkod Base64?

Mary-Kate Olsen
Lepaskan: 2024-11-12 08:04:02
asal
498 orang telah melayarinya

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

Marshalling json.RawMessage Returns Base64 Encoded String

Apabila memanggil json.Marshal dengan nilai json.RawMessage, hasilnya adalah tidak dijangka. Daripada rentetan JSON yang dikehendaki, rentetan yang dikodkan base64 dikembalikan.

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=="
}
Salin selepas log masuk

Isunya terletak pada penggunaan json.RawMessage dalam json.Marshal. Jenis json.RawMessage, yang direka untuk menyimpan data JSON mentah tanpa menyahkodnya, mempunyai kaedah MarshalJSON yang hanya mengembalikan kepingan bait.

func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil
}
Salin selepas log masuk

Walau bagaimanapun, agar json.Marshal berfungsi dengan betul dengan json.RawMessage, nilai yang diluluskan mestilah penunjuk kepada contoh json.RawMessage.

j, err := json.Marshal(&raw)
Salin selepas log masuk

Dengan menghantar penunjuk kepada json.RawMessage, kaedah MarshalJSON digunakan pada penunjuk, memastikan bahawa kepingan bait dikembalikan tanpa base64 pengekodan.

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"}"
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah json.Marshal dengan json.RawMessage mengembalikan rentetan berkod Base64?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan