Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Adakah `json.RawMessage` Saya Marshal sebagai Base64?

Mengapa Adakah `json.RawMessage` Saya Marshal sebagai Base64?

Susan Sarandon
Susan Sarandonasal
2024-11-09 21:35:02493semak imbas

Why Does My `json.RawMessage` Marshal as Base64?

Marshalling json.RawMessage: Mendedahkan Sebab Di Sebalik Pengekodan Base64

Dalam senario yang menarik ini, anda telah menghadapi tingkah laku yang tidak normal semasa cuba untuk marshal a json.RawMessage instance. Anehnya, daripada mendapatkan rentetan JSON yang tidak dikodkan yang dijangkakan, anda telah menemui versi yang dikodkan base64 dengan teliti. Untuk menyelesaikan teka-teki ini, mari kita menyelidiki kedalaman mekanik asas.

Adalah penting untuk menyedari bahawa apabila menggunakan fungsi Marshal pada json.RawMessage, faktor penting terletak pada memastikan nilai input berada dalam fakta penunjuk. Perbezaan yang nampaknya halus ini memainkan peranan penting dalam gelagat json.RawMessage.

Seperti yang anda nyatakan dengan betul, pelaksanaan json.RawMessage bagi MarshalJSON direka untuk hanya mengembalikan kepingan bait asas. Walau bagaimanapun, jika nilai input bukan penunjuk, fungsi Marshal secara automatik akan menggunakan pengekodan base64 pada kepingan bait sebelum mengeluarkannya.

Untuk membetulkan keadaan ini dan mendapatkan hasil yang diingini, penyelesaiannya semudah lulus penunjuk ke json.RawMessage anda. Dengan berbuat demikian, anda secara berkesan mengarahkan fungsi Marshal untuk beroperasi pada kepingan bait asas secara langsung, sekali gus memintas proses pengekodan base64 yang tidak diingini.

Pertimbangkan coretan kod yang diubah suai berikut:

package main

import (
    "encoding/json"
    "fmt"
)

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

Oleh melaksanakan perubahan yang halus namun penting ini, anda kini boleh menjangka dengan yakin dengan jangkaan hasil:

{"foo":"bar"}

Kod yang diubah suai ini sejajar dengan keperluan fungsi Marshal untuk nilai input berasaskan penunjuk, dengan berkesan menghapuskan pengekodan base64 yang tidak diingini. Berbekalkan pengetahuan baharu ini, anda kini boleh menangani cabaran serupa dengan yakin dan memastikan gelagat penggabungan JSON yang diingini dalam aplikasi Go anda.

Atas ialah kandungan terperinci Mengapa Adakah `json.RawMessage` Saya Marshal 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