Rumah >pembangunan bahagian belakang >Golang >Mengapa json.Marshal Mengekodkan json.RawMessage sebagai Base64?

Mengapa json.Marshal Mengekodkan json.RawMessage sebagai Base64?

DDD
DDDasal
2024-11-08 21:40:02966semak imbas

Why Does json.Marshal Encode json.RawMessage as Base64?

Marshalling json.RawMessage: Deciphering Base64 Encoding

Dalam cubaan untuk menyusun objek json.RawMessage, anda mungkin menghadapi dikodkan base64 yang tidak dijangka rentetan sebagai output dan bukannya rentetan JSON yang dikehendaki. Untuk merungkai gelagat ini, mari kita mendalami konsep asas.

json.RawMessage, seperti namanya, direka bentuk untuk mengendalikan data JSON mentah sebagai kepingan bait. Apabila anda cuba menyusun RawMessage menggunakan json.Marshal, tingkah laku lalai adalah untuk mengekodnya seolah-olah ia adalah []bait biasa. Ini membawa kepada pengekodan base64 yang anda perhatikan.

Untuk mengatasinya, penyelesaiannya terletak pada menghantar penunjuk kepada RawMessage kepada json.Marshal. Ini kerana kaedah MarshalJSON RawMessage, yang bertanggungjawab untuk proses marshaling, mengharapkan penunjuk sebagai hujahnya. Tanpa penuding, ia tidak boleh mengembalikan kepingan bait dengan betul seperti yang dimaksudkan.

Dengan mengubah suai kod anda untuk menghantar penuding, seperti yang ditunjukkan di bawah, anda akan mendapatkan semula rentetan JSON yang dijangkakan sebagai output:

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 Mengapa json.Marshal Mengekodkan json.RawMessage sebagai 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