Encodage et décodage JSON avec []byte Fields dans Go
En Go, travailler avec des données JSON implique souvent l'encodage et le décodage de structures de données pour et du format JSON. Un scénario courant est rencontré lors de la tentative de sérialisation de chaînes représentées sous forme de champs []byte dans JSON.
Conversion Base64 par json.Marshal()
Par défaut, le json La méthode .Marshal() traite spécialement les champs []bytes. Au lieu de les sérialiser sous forme d’octets bruts, il les code sous forme de chaînes codées en base64. Cette conversion est nécessaire car JSON n'a pas de représentation native pour les données binaires.
Écarts par rapport au résultat attendu
Pour illustrer ce comportement, considérez l'extrait de code suivant :
<code class="go">package main import ( "fmt" "encoding/json" ) type Msg struct { Content []byte } func main() { helloStr := "Hello" helloSlc := []byte(helloStr) fmt.Println(helloStr, helloSlc) obj := Msg{helloSlc} json, _ := json.Marshal(obj) fmt.Println(string(json)) }</code>
Sortie :
Hello [72 101 108 108 111] {"Content":"SGVsbG8="}
Comme vous pouvez le voir, la chaîne JSON contient le version codée en base64 de la chaîne "Bonjour" au lieu de la chaîne d'origine elle-même.
Comprendre la conversion
La raison de ce comportement est enracinée dans la spécification JSON, qui n'a pas de représentation native pour les octets bruts. En codant en base64 le champ []byte, json.Marshal() garantit la compatibilité avec le format JSON tout en préservant l'intégrité des données d'origine.
Gestion de l'encodage personnalisé
Si vous préférez conserver les octets bruts plutôt que de les encoder en base64, vous pouvez implémenter une logique de sérialisation et de désérialisation personnalisée. Cela implique généralement de remplacer les méthodes MarshalJSON() et UnmarshalJSON() de votre structure.
Exemples de marshaling personnalisé :
<code class="go">func (m *Msg) MarshalJSON() ([]byte, error) { type Alias Msg return json.Marshal((*Alias)(m)) }</code>
<code class="go">func (m *Msg) UnmarshalJSON(b []byte) error { type Alias Msg var a Alias if err := json.Unmarshal(b, &a); err != nil { return err } *m = Msg(a) return nil }</code>
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!