Maison > développement back-end > Golang > le corps du texte

Pourquoi json.Marshal avec json.RawMessage renvoie-t-il une chaîne codée en Base64 ?

Mary-Kate Olsen
Libérer: 2024-11-12 08:04:02
original
460 Les gens l'ont consulté

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

Le marshalling de json.RawMessage renvoie une chaîne codée en Base64

Lors de l'appel de json.Marshal avec une valeur json.RawMessage, le résultat est inattendu. Au lieu de la chaîne JSON souhaitée, une chaîne codée en base64 est renvoyée.

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=="
}
Copier après la connexion

Le problème réside dans l'utilisation de json.RawMessage dans json.Marshal. Le type json.RawMessage, conçu pour stocker des données JSON brutes sans les décoder, possède une méthode MarshalJSON qui renvoie simplement la tranche d'octets.

func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil
}
Copier après la connexion

Cependant, pour que json.Marshal fonctionne correctement avec json.RawMessage, la valeur transmise doit être un pointeur vers l'instance json.RawMessage.

j, err := json.Marshal(&raw)
Copier après la connexion

En passant un pointeur vers json.RawMessage, la méthode MarshalJSON est invoquée sur le pointeur, garantissant que la tranche d'octets est renvoyée sans base64 encodage.

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"}"
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal