Heim > Backend-Entwicklung > Golang > Wie verhindert man „Escape' beim JSON-Marshalling in Go?

Wie verhindert man „Escape' beim JSON-Marshalling in Go?

Linda Hamilton
Freigeben: 2024-12-21 10:33:14
Original
376 Leute haben es durchsucht

How to Prevent `` Escaping During JSON Marshaling in Go?

Kodierungshindernisse überwinden: < und > Escape in json.Marshal

Einführung

Beim Umgang mit Daten im JSON-Format ist es manchmal notwendig, bestimmte Zeichen beizubehalten, z. B. < und > als Teil der codierten Zeichenfolge. Allerdings maskiert json.Marshal, die Standardfunktion der Go-Bibliothek zum Konvertieren von Objekten in JSON-Strings, diese Zeichen automatisch, um potenzielle Sicherheitslücken zu vermeiden. Dies kann problematisch sein, wenn die Daten HTML- oder XML-Code enthalten, der auf diesen Zeichen basiert.

Problem

Im folgenden Codeausschnitt enthält das Feld „XmlRequest“ HTML- wie Inhalt, aber nach der JSON.Marshal-Codierung ist < und > Zeichen werden maskiert:

package main

import (
    "encoding/json"
    "fmt"
)

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

func main() {
    track := new(Track)
    track.XmlRequest = "<car><mirror>XML</mirror></car>"
    trackJSON, _ := json.Marshal(track)
    fmt.Println("After Marshal:", string(trackJSON))
}
Nach dem Login kopieren

Die resultierende JSON-Zeichenfolge ist:

{"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
Nach dem Login kopieren

Die gewünschte JSON-Zeichenfolge wäre jedoch:

{"xmlRequest":"<car><mirror>XML</mirror></car>"}
Nach dem Login kopieren

Lösung

Ab Go 1.7 gibt es keinen integrierten Mechanismus in json.Marshal um das Entkommen zu deaktivieren. Eine Problemumgehung besteht jedoch darin, eine benutzerdefinierte Funktion zu erstellen, die das Escape-Verhalten explizit steuert.

func (t *Track) JSON() ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(t); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
Nach dem Login kopieren

In dieser benutzerdefinierten JSON()-Methode ist das SetEscapeHTML-Flag des Encoders auf „false“ gesetzt, wodurch das Escapen von HTML-Zeichen deaktiviert wird. Durch den Aufruf dieser Methode anstelle von json.Marshal kann der ursprüngliche Inhalt ohne Escape beibehalten werden:

trackJSON, err := track.JSON()
Nach dem Login kopieren

Alternativ kann eine allgemeinere Lösung implementiert werden, indem eine Funktion erstellt wird, die eine beliebige Schnittstelle{} als Eingabe akzeptiert:

func JSONMarshal(v interface{}) ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(v); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie verhindert man „Escape' beim JSON-Marshalling in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage