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

Partager un enregistrement de piège Go json

藏色散人
Libérer: 2021-06-15 11:05:23
avant
2223 Les gens l'ont consulté

Ce qui suit est un enregistrement de piège Go json partagé par la colonne tutoriel golang J'espère qu'il sera utile aux amis dans le besoin !

JSON, un langage d'échange de données léger, est basé sur du texte facile à lire et est utilisé pour transmettre des objets de données composés de valeurs d'attribut ou de valeurs série. Maintenant, il est largement utilisé. Bien sûr, Go fournit également un support complet. Vous pouvez facilement sérialiser et désérialiser les données JSON via encoding/json. Mais certains points clés nécessitent une attention particulière.

Go peut utiliser json.Marshal() pour obtenir facilement des données JSON. Consultez le document godoc correspondant à cette fonction. Il contient le passage suivant :

String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode replacement rune. So that the JSON will be safe to embed inside HTML <script> tags, the string is encoded using HTMLEscape, which replaces "<", ">", "&", U+2028, and U+2029 are escaped to "\u003c","\u003e", "\u0026", "\u2028", and "\u2029". This replacement can be disabled when using an Encoder, by calling SetEscapeHTML(false).
Copier après la connexion

json.Marshal() Lors de la sérialisation. L'encodage HTMLEscape convertira "<", ">", "&", U+2028 et U+2029 en "u003c", "u003e", "u0026", "u2028" et "u2029" . Ce n'est pas un problème en utilisation normale, mais si un tiers doit extraire et comparer le résumé de la chaîne JSON, si une partie n'effectue pas l'encodage HTMLEscape, le résumé extrait sera complètement différent. Le document ci-dessus fournit également une solution, qui peut être désactivée par SetEscapeHTML(false). La méthode est la suivante :

bf := bytes.NewBuffer([]byte{})jsonEncoder := json.NewEncoder(bf)jsonEncoder.SetEscapeHTML(false)_ = jsonEncoder.Encode(body)jsonStr := bf.String()
Copier après la connexion

Cependant, il y a encore quelques problèmes lors de son utilisation de cette façon. json.Encoder.Encode() sera suivi d'un caractère de saut de ligne après la chaîne JSON. Le code de cette fonction est le suivant :

// Encode writes the JSON encoding of v to the stream,
// followed by a newline character.
//
// See the documentation for Marshal for details about the
// conversion of Go values to JSON.
func (enc *Encoder) Encode(v interface{}) error {
    if enc.err != nil {
        return enc.err
    }
    e := newEncodeState()
    err := e.marshal(v, encOpts{escapeHTML: enc.escapeHTML})
    if err != nil {
        return err
    }

    // Terminate each value with a newline.
    // This makes the output look a little nicer
    // when debugging, and some kind of space
    // is required if the encoded value was a number,
    // so that the reader knows there aren&#39;t more
    // digits coming.
    e.WriteByte(&#39;\n&#39;)

    b := e.Bytes()
    if enc.indentPrefix != "" || enc.indentValue != "" {
        if enc.indentBuf == nil {
            enc.indentBuf = new(bytes.Buffer)
        }
        enc.indentBuf.Reset()
        err = Indent(enc.indentBuf, b, enc.indentPrefix, enc.indentValue)
        if err != nil {
            return err
        }
        b = enc.indentBuf.Bytes()
    }
    if _, err = enc.w.Write(b); err != nil {
        enc.err = err
    }
    encodeStatePool.Put(e)
    return err
}
Copier après la connexion

Comme on peut le voir, la fonction écrit un autre caractère n après la sérialisation. Si le caractère n'est pas nécessaire, un décapage supplémentaire est requis :

jsonStr := string(bf.Bytes()[:bf.bf.Len()])
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!

Étiquettes associées:
source:learnku.com
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