Maison > développement back-end > Golang > Pourquoi mon json.RawMessage est-il encodé en base64 lors de l'utilisation de « json.Marshal » ?

Pourquoi mon json.RawMessage est-il encodé en base64 lors de l'utilisation de « json.Marshal » ?

Patricia Arquette
Libérer: 2024-11-09 06:56:02
original
565 Les gens l'ont consulté

Why is my json.RawMessage being base64 encoded when using `json.Marshal`?

Problème d'encodage Base64 avec json.Marshal et json.RawMessage

Dans le code fourni, json.Marshal est appliqué à un json.RawMessage , qui est destiné à représenter des données JSON arbitraires. Cependant, la sortie est de manière inattendue codée en base64.

Problème

Après enquête, il devient évident que la méthode MarshalJSON de json.RawMessage renvoie simplement la tranche d'octets du message, comme vu ici :

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil 
}
Copier après la connexion

Par conséquent, lorsque json.Marshal est appelé sans pointeur vers le RawMessage, il le traite par erreur comme un []octet ordinaire, ce qui entraîne un encodage en base64.

Solution

Comme suggéré dans le fil de discussion go-nuts, le la solution consiste à fournir un pointeur vers json.RawMessage lors de l'appel de json.Marshal, comme indiqué ci-dessous :

package main

import (
    "encoding/json"
    "fmt"
)

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

Cette approche s'aligne sur le comportement attendu de json.Marshal, où elle suppose que les non-pointeurs représentent les valeurs d'octets brutes. En fournissant un pointeur vers RawMessage, il reconnaît correctement le message en tant que valeur JSON et le restitue en conséquence.

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