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
Patricia ArquetteOriginal
2024-12-10 14:25:11254Durchsuche

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

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
}

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
}

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!

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