Maison > développement back-end > Golang > Comment empêcher l'échappement pendant le marshaling JSON dans Go ?

Comment empêcher l'échappement pendant le marshaling JSON dans Go ?

Linda Hamilton
Libérer: 2024-12-21 10:33:14
original
376 Les gens l'ont consulté

How to Prevent `` Escaping During JSON Marshaling in Go?

Surmonter les obstacles à l'encodage : suppression de < et > S'échapper dans json.Marshal

Introduction

Lorsqu'on traite des données au format JSON, il est parfois nécessaire de conserver certains caractères, comme < et >, dans le cadre de la chaîne codée. Cependant, json.Marshal, la fonction par défaut de la bibliothèque Go pour convertir des objets en chaînes JSON, échappe automatiquement ces caractères pour éviter d'éventuelles failles de sécurité. Cela peut être problématique lorsque les données contiennent du code HTML ou XML, qui repose sur ces caractères.

Problème

Dans l'extrait de code suivant, le champ XmlRequest contient du HTML- comme le contenu, mais après l'encodage json.Marshal, le < et > les caractères sont échappés :

package main

import (
    "encoding/json"
    "fmt"
)

type Track struct {
    XmlRequest string `json:"xmlRequest"`
}

func main() {
    track := new(Track)
    track.XmlRequest = "<car><mirror>XML</mirror></car>"
    trackJSON, _ := json.Marshal(track)
    fmt.Println("After Marshal:", string(trackJSON))
}</p>
<p>La chaîne JSON résultante est :</p>
<pre class="brush:php;toolbar:false">{"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
Copier après la connexion

La chaîne JSON souhaitée, cependant, serait :

{"xmlRequest":"<car><mirror>XML</mirror></car>"}
Copier après la connexion

Solution

Depuis Go 1.7, il n'y a pas de mécanisme intégré dans json.Marshal pour désactiver l'évasion. Cependant, une solution de contournement consiste à créer une fonction personnalisée qui contrôle explicitement le comportement d'échappement.

func (t *Track) JSON() ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(t); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
Copier après la connexion

Dans cette méthode JSON() personnalisée, l'indicateur SetEscapeHTML de l'encodeur est défini sur false, désactivant ainsi l'échappement des caractères HTML. En appelant cette méthode au lieu de json.Marshal, le contenu original peut être préservé sans s'échapper :

trackJSON, err := track.JSON()
Copier après la connexion

Alternativement, une solution plus générique peut être implémentée en créant une fonction qui prend n'importe quelle interface{} en entrée :

func JSONMarshal(v interface{}) ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(v); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal