Marshaling JSON []byte as Strings
Question :
En Go, lors de l'encodage une structure contenant un champ []byte au format JSON, le JSON résultant inclut une représentation sous forme de chaîne non attendue du contenu de la tranche. Par exemple, le code :
type Msg struct { Content []byte } func main() { helloStr := "Hello" helloSlc := []byte(helloStr) json, _ := json.Marshal(Msg{helloSlc}) fmt.Println(string(json)) }
Produit la chaîne JSON :
{"Content":"SGVsbG8="}
Quelle conversion est effectuée par json.Marshal sur le contenu de la tranche, et comment le contenu de la chaîne d'origine peut-il être préservé ?
Réponse :
Encodage Base64
Par défaut, la fonction json.Marshal de Go encode []les tableaux d'octets comme Chaînes codées en base64 pour représenter les octets bruts dans JSON. Selon la spécification JSON, JSON n'a pas de représentation native pour les octets bruts.
Marshaling personnalisé :
Pour préserver le contenu de la chaîne d'origine, un marshaling personnalisé peut être implémenté en définissant une méthode MarshalJSON personnalisée pour la structure Msg :
import ( "encoding/json" "fmt" ) type Msg struct { Content []byte } func (m Msg) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf(`{"Content": "%s"}`, m.Content)), nil } func main() { helloStr := "Hello" helloSlc := []byte(helloStr) json, _ := json.Marshal(Msg{helloSlc}) fmt.Println(string(json)) }
Cette implémentation personnalisée encode le champ Contenu sous forme de chaîne dans l'objet JSON, préservant son contenu d'origine.
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!