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
Patricia Arquetteoriginal
2024-11-09 06:56:02574parcourir

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 
}

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!

Déclaration:
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