Heim > Backend-Entwicklung > Golang > Teilen Sie einen Go-JSON-Trap-Datensatz

Teilen Sie einen Go-JSON-Trap-Datensatz

藏色散人
Freigeben: 2021-06-15 11:05:23
nach vorne
2255 Leute haben es durchsucht

Das Folgende ist ein Go-JSON-Fallfall-Datensatz, der von der golangTutorial-Kolumne geteilt wird. Ich hoffe, dass er Freunden in Not hilfreich sein wird!

Go kann json.Marshal() verwenden, um das dieser Funktion entsprechende Godoc-Dokument anzuzeigen. Darin befindet sich diese Passage: encoding/json 便可方便的序列化及反序列化 JSON 数据。但是也有些关键点需要额外注意下。

Go 可使用 json.Marshal() 便捷的获取 JSON 数据,查看该函数对应的 godoc 文档,里面有这么一段话:

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).
Nach dem Login kopieren

json.Marshal() 在进行序列化时,会进行 HTMLEscape 编码,会将 “<”, “>”, “&”, U+2028, 及 U+2029 转码成 “u003c”,”u003e”, “u0026”, “u2028”, 和 “u2029”。这在正常使用时是没有问题的,但如果在对接第三方需要对 JSON 字符串进行取摘要比对时,如果一方未进行 HTMLEscape 编码,取出的摘要便会天差地别。上述文档中也给出了解决方法,通过 SetEscapeHTML(false) 来禁用便可。方法如下:

bf := bytes.NewBuffer([]byte{})jsonEncoder := json.NewEncoder(bf)jsonEncoder.SetEscapeHTML(false)_ = jsonEncoder.Encode(body)jsonStr := bf.String()
Nach dem Login kopieren

但是这样使用仍然会有些问题,json.Encoder.Encode() 会在 JSON 字符串后接一个 换行符,该函数源码如下:

// 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
}
Nach dem Login kopieren

可以看出,该函数在进行序列化后又写入了一个 n

jsonStr := string(bf.Bytes()[:bf.bf.Len()])
Nach dem Login kopieren
json.Marshal(). code> Bei der Serialisierung wird die HTMLEscape-Codierung durchgeführt und „<“, „>“, „&“, U+2028 und U+2029 werden in „u003c“, „u003e“, „u0026“ transkodiert “, „u2028“ und „u2029“. Dies ist bei normaler Verwendung kein Problem, aber wenn ein Dritter die JSON-String-Zusammenfassung extrahieren und vergleichen muss und eine Partei keine HTMLEscape-Codierung durchführt, ist die extrahierte Zusammenfassung völlig anders. Das obige Dokument bietet auch eine Lösung, die durch <code>SetEscapeHTML(false) deaktiviert werden kann. Die Methode lautet wie folgt: 🎜rrreee🎜Aber es gibt immer noch einige Probleme, wenn sie auf diese Weise verwendet wird. json.Encoder.Encode() fügt nach der JSON-Zeichenfolge ein 🎜Zeilenumbruchzeichen hinzu Der Code dieser Funktion lautet wie folgt: 🎜rrreee🎜Okay Es ist ersichtlich, dass die Funktion nach der Serialisierung ein weiteres n-Zeichen schreibt. Wenn der Charakter nicht benötigt wird, ist zusätzliches Strippen erforderlich: 🎜rrreee

Das obige ist der detaillierte Inhalt vonTeilen Sie einen Go-JSON-Trap-Datensatz. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage