Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah json.Marshal dengan json.RawMessage mengembalikan rentetan berkod Base64?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-12 08:04:02499semak imbas

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=="
}

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
}

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)

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"}"
}

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!

Kenyataan:
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