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 }
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)) }
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!