Maison  >  Article  >  développement back-end  >  Comment gérez-vous les champs []byte dans Go lors de l'encodage et du décodage JSON ?

Comment gérez-vous les champs []byte dans Go lors de l'encodage et du décodage JSON ?

DDD
DDDoriginal
2024-11-06 15:07:02344parcourir

How do you handle []byte fields in Go when encoding and decoding JSON?

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!

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