ホームページ >バックエンド開発 >Golang >Go で JSON Marshal が山括弧とアンパサンドをエスケープしないようにするにはどうすればよいですか?

Go で JSON Marshal が山括弧とアンパサンドをエスケープしないようにするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-10 14:25:11253ブラウズ

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

JSON Marshal での山括弧とアンパサンドのエスケープ

問題

Go では、json.Marshal 関数が自動的に山括弧 (<, >) をエスケープします。 ;) とアンパサンド (&) を文字列に使用します。ただし、これは状況によっては望ましくない場合があります。

次の例を考えてみましょう。

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>このコードは次の出力を出力します。</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"}

XML リクエスト文字列の山括弧とアンパサンドは、JSON ではエスケープされます。 Output.

解決策

Go 1.7 より前では、json.Marshal がこれらの文字をエスケープするのを防ぐことはできませんでした。ただし、次の回避策があります。

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

この関数は、最初にバイト バッファーと JSON エンコーダーを作成します。次に、EscapeHTML オプションを false に設定して、エンコーダが山括弧やアンパサンドを含む HTML 文字をエスケープしないようにします。

このソリューションを独自のカスタム型に適用する場合は、JSON() 関数を次のように変更します。

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

これで、JSONMarshal を使用してカスタム型をマーシャリングし、山括弧や山括弧のエスケープを防ぐことができます。アンパサンド。

以上がGo で JSON Marshal が山括弧とアンパサンドをエスケープしないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。