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)) }
Die resultierende JSON-Zeichenfolge ist:
{"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
Die gewünschte JSON-Zeichenfolge wäre jedoch:
{"xmlRequest":"<car><mirror>XML</mirror></car>"}
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 }
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()
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 }
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!