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)) }
Par en mettant en œuvre ce changement subtil mais essentiel, vous pouvez désormais anticiper en toute confiance le résultat attendu :
{"foo":"bar"}
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!