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

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

Linda Hamilton
Linda HamiltonOriginal
2024-12-21 10:33:14377Durchsuche

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))
}

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!

Stellungnahme:
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