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
Patricia Arquetteoriginal
2024-12-10 14:25:11254parcourir

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"}

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
}

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
}

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!

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