Maison > développement back-end > Golang > le corps du texte

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

DDD
Libérer: 2024-11-06 15:07:02
original
417 Les gens l'ont consulté

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>
Copier après la connexion

Sortie :

Hello [72 101 108 108 111]
{"Content":"SGVsbG8="}
Copier après la connexion

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>
Copier après la connexion
<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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal