Maison > développement back-end > Golang > Comment contourner l'échappement des caractères HTML dans « json.Marshal » de Go ?

Comment contourner l'échappement des caractères HTML dans « json.Marshal » de Go ?

Linda Hamilton
Libérer: 2024-12-11 14:01:10
original
887 Les gens l'ont consulté

How to Bypass HTML Character Escaping in Go's `json.Marshal`?

Contourner l'échappement des caractères HTML dans json.Marshal

La fonction json.Marshal de Go échappe automatiquement certains caractères, y compris < et >, pour éviter toute interprétation erronée par les navigateurs. Cependant, ce comportement peut s'avérer indésirable lors de la sérialisation de données XML, car il modifie le contenu prévu.

Malheureusement, il n'est pas possible de désactiver l'échappement de caractères à l'aide de la seule fonction json.Marshal. Le code source révèle que les caractères d'échappement sont codés en dur comme étant vrais, garantissant que < et > sont toujours convertis respectivement en "u003c" et "u003e". Cette limitation s'étend à l'implémentation de méthodes MarshalJSON personnalisées, car elles reposent toujours sur l'implémentation interne de json.Marshal.

Pour surmonter cet obstacle, une solution de contournement consiste à définir une fonction personnalisée pour le marshalling. Voici une version modifiée de votre type Track qui implémente une méthode JSON :

import "bytes"
import "encoding/json"

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

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

En utilisant cette méthode JSON personnalisée, vous pouvez contrôler le comportement d'échappement en définissant explicitement SetEscapeHTML(false).

Si vous avez besoin d'une solution générique pour une structure, vous pouvez définir la fonction suivante :

import "bytes"
import "encoding/json"

func JSONMarshal(t interface{}) ([]byte, error) {
    buffer := &bytes.Buffer{}
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    err := encoder.Encode(t)
    return buffer.Bytes(), err
}
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