Maison  >  Article  >  développement back-end  >  Comment conserver le contenu de la chaîne d'origine lors du rassemblement d'un champ « []byte » dans une structure Go en tant que JSON ?

Comment conserver le contenu de la chaîne d'origine lors du rassemblement d'un champ « []byte » dans une structure Go en tant que JSON ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 11:04:02257parcourir

How to Preserve Original String Content When Marshaling a `[]byte` Field in a Go Struct as JSON?

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!

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