Maison >développement back-end >Golang >Partager un enregistrement de piège Go json
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 3f1c4e4b6b16bbbd69b2ee476dc4f83a tags, the string is encoded using HTMLEscape, which replaces "0c43feb88fe3846c3aee3dd8022b72eb", "&", 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).
json.Marshal()
Lors de la sérialisation. L'encodage HTMLEscape convertira "6745434bf92a2979d589ede8e8e7bea9", "&", 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()
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't more // digits coming. e.WriteByte('\n') 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 }
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()])
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!