Heim > Backend-Entwicklung > Golang > Wie kann verhindert werden, dass JSON Marshal in Go spitze Klammern und kaufmännische Und-Zeichen umgeht?

Wie kann verhindert werden, dass JSON Marshal in Go spitze Klammern und kaufmännische Und-Zeichen umgeht?

Patricia Arquette
Freigeben: 2024-12-10 14:25:11
Original
301 Leute haben es durchsucht

How to Prevent JSON Marshal from Escaping Angle Brackets and Ampersands in Go?

Escape von spitzen Klammern und kaufmännischen Und-Zeichen in JSON Marshal

Problem

In Go maskiert die json.Marshal-Funktion automatisch spitze Klammern (<, > ;) und kaufmännische Und-Zeichen (&) in Zeichenfolgen. Dies kann jedoch in bestimmten Situationen unerwünscht sein.

Betrachten Sie das folgende Beispiel:

package main

import (
    "fmt"
    "encoding/json"
)

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

func main() {
    message := new(Track)
    message.XmlRequest = "<car><mirror>XML</mirror></car>"
    fmt.Println("Before Marshal", message)
    messageJSON, _ := json.Marshal(message)
    fmt.Println("After marshal", string(messageJSON))
}</p>
<p>Dieser Code gibt die folgende Ausgabe aus:</p>
<pre class="brush:php;toolbar:false">Before Marshal {xmlRequest:<car><mirror>XML</mirror></car>}
After marshal {"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
Nach dem Login kopieren

Beachten Sie, dass die Spitze Klammern und kaufmännisches Und in der XML-Anforderungszeichenfolge werden im JSON mit Escapezeichen versehen Ausgabe.

Lösung

Vor Go 1.7 war es unmöglich zu verhindern, dass json.Marshal diesen Zeichen entkommt. Allerdings gibt es jetzt einen Workaround:

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

Diese Funktion erstellt zunächst einen Bytepuffer und einen JSON-Encoder. Anschließend wird die EscapeHTML-Option auf „false“ gesetzt, um zu verhindern, dass der Encoder HTML-Zeichen, einschließlich spitzer Klammern und kaufmännischer Und-Zeichen, maskiert.

Wenn Sie diese Lösung auf Ihren eigenen benutzerdefinierten Typ anwenden möchten, ändern Sie die JSON()-Funktion als folgt:

func JSONMarshal(t interface{}) ([]byte, error) {
    buffer := &bytes.Buffer{}
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    err := encoder.Encode(t)
    return buffer.Bytes(), err
}
Nach dem Login kopieren

Jetzt können Sie JSONMarshal verwenden, um jeden benutzerdefinierten Typ zu marsalieren und das Escape von spitzen Klammern und zu verhindern kaufmännische Und-Zeichen.

Das obige ist der detaillierte Inhalt vonWie kann verhindert werden, dass JSON Marshal in Go spitze Klammern und kaufmännische Und-Zeichen umgeht?. 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