Maison  >  Article  >  développement back-end  >  Pourquoi json.Marshal avec json.RawMessage renvoie-t-il une chaîne codée en Base64 ?

Pourquoi json.Marshal avec json.RawMessage renvoie-t-il une chaîne codée en Base64 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 08:04:02491parcourir

Why does json.Marshal with json.RawMessage return a Base64 encoded string?

Le marshalling de json.RawMessage renvoie 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!

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