Maison > développement back-end > Golang > Comment empêcher JSON Marshal d'échapper aux crochets angulaires et aux esperluettes dans Go ?

Comment empêcher JSON Marshal d'échapper aux crochets angulaires et aux esperluettes dans Go ?

Patricia Arquette
Libérer: 2024-12-10 14:25:11
original
301 Les gens l'ont consulté

How to Prevent JSON Marshal from Escaping Angle Brackets and Ampersands in Go?

Échappement des crochets angulaires et des esperluettes dans JSON Marshal

Problème

Dans Go, la fonction json.Marshal échappe automatiquement les crochets angulaires (<, > ;) et les esperluettes (&) dans les chaînes. Cependant, cela peut être indésirable dans certaines situations.

Considérons l'exemple suivant :

package main

import (
    "fmt"
    "encoding/json"
)

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

func main() {
    message := new(Track)
    message.XmlRequest = "<car><mirror>XML</mirror></car>"
    fmt.Println("Before Marshal", message)
    messageJSON, _ := json.Marshal(message)
    fmt.Println("After marshal", string(messageJSON))
}</p>
<p>Ce code imprimera le résultat suivant :</p>
<pre class="brush:php;toolbar:false">Before Marshal {xmlRequest:<car><mirror>XML</mirror></car>}
After marshal {"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
Copier après la connexion

Remarquez que le les crochets angulaires et l'esperluette dans la chaîne de requête XML sont échappés dans le JSON sortie.

Solution

Avant Go 1.7, il était impossible d'empêcher json.Marshal d'échapper à ces caractères. Cependant, il existe désormais une solution de contournement :

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

Cette fonction crée d'abord un tampon d'octets et un encodeur JSON. Ensuite, il définit l'option EscapeHTML sur false pour empêcher l'encodeur d'échapper aux caractères HTML, y compris les crochets angulaires et les esperluettes.

Si vous souhaitez appliquer cette solution à votre propre type personnalisé, modifiez la fonction JSON() comme suit :

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

Maintenant, vous pouvez utiliser JSONMarshal pour rassembler n'importe quel type personnalisé et empêcher l'échappement des crochets angulaires et esperluette.

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