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

Pourquoi mon « json.RawMessage » est-il marshal en Base64 ?

Susan Sarandon
Libérer: 2024-11-09 21:35:02
original
462 Les gens l'ont consulté

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

Marshalling json.RawMessage : dévoilement de la raison derrière le codage Base64

Dans ce scénario intrigant, vous avez rencontré un comportement anormal en essayant de marshaler une instance json.RawMessage. Étonnamment, au lieu d’obtenir la chaîne JSON non codée attendue, vous avez rencontré une version méticuleusement codée en base64. Pour résoudre cette énigme, plongeons dans les profondeurs de la mécanique sous-jacente.

Il est essentiel de reconnaître que lors de l'utilisation de la fonction Marshal sur un json.RawMessage, le facteur crucial réside dans la garantie que la valeur d'entrée est dans fait un pointeur. Cette distinction apparemment subtile joue un rôle central dans le comportement de json.RawMessage.

Comme vous l'avez souligné à juste titre, l'implémentation de MarshalJSON par json.RawMessage est conçue pour renvoyer simplement la tranche d'octets sous-jacente. Cependant, si la valeur d'entrée n'est pas un pointeur, la fonction Marshal appliquera automatiquement le codage base64 à la tranche d'octets avant de la sortir.

Pour remédier à cette situation et obtenir le résultat souhaité, la solution est aussi simple que de passer un pointeur vers votre json.RawMessage. Ce faisant, vous demandez effectivement à la fonction Marshal d'opérer directement sur la tranche d'octets sous-jacente, contournant ainsi le processus d'encodage base64 indésirable.

Considérez l'extrait de code modifié suivant :

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

Par en mettant en œuvre ce changement subtil mais essentiel, vous pouvez désormais anticiper en toute confiance le résultat attendu :

{"foo":"bar"}
Copier après la connexion

Ce code modifié s'aligne sur l'exigence de la fonction Marshal pour des valeurs d'entrée basées sur un pointeur, éliminant ainsi l'encodage base64 indésirable. Armé de ces nouvelles connaissances, vous pouvez désormais relever en toute confiance des défis similaires et garantir le comportement de marshalling JSON souhaité dans vos applications Go.

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