Maison > Article > développement back-end > Pourquoi json.Marshal avec json.RawMessage renvoie-t-il une chaîne codée en Base64 ?
Lors de l'appel de json.Marshal avec une valeur json.RawMessage, le résultat est inattendu. Au lieu de la chaîne JSON souhaitée, une chaîne codée en base64 est renvoyée.
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(raw) if err != nil { panic(err) } fmt.Println(string(j)) // Output: "eyJmb28iOiJiYXIifQ==" }
Le problème réside dans l'utilisation de json.RawMessage dans json.Marshal. Le type json.RawMessage, conçu pour stocker des données JSON brutes sans les décoder, possède une méthode MarshalJSON qui renvoie simplement la tranche d'octets.
func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
Cependant, pour que json.Marshal fonctionne correctement avec json.RawMessage, la valeur transmise doit être un pointeur vers l'instance json.RawMessage.
j, err := json.Marshal(&raw)
En passant un pointeur vers json.RawMessage, la méthode MarshalJSON est invoquée sur le pointeur, garantissant que la tranche d'octets est renvoyée sans base64 encodage.
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(&raw) if err != nil { panic(err) } fmt.Println(string(j)) // Output: "{"foo":"bar"}" }
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!