首頁 > 後端開發 > Golang > 如何在 Go 中的 JSON 封送過程中防止 `` 轉義?

如何在 Go 中的 JSON 封送過程中防止 `` 轉義?

Linda Hamilton
發布: 2024-12-21 10:33:14
原創
376 人瀏覽過

How to Prevent `` Escaping During JSON Marshaling in Go?

克服編碼障礙:抑制

和> json.Marshal中的轉義

簡介

在處理JSON格式的資料時,有時需要保留某些字符,例如

和>,作為編碼字串的一部分。然而,json.Marshal(用於將物件轉換為 JSON 字串的預設 Go 庫函數)會自動轉義這些字元以防止潛在的安全漏洞。當資料包含依賴這些字元的 HTML 或 XML 程式碼時,這可能會出現問題。

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))
}
登入後複製
問題

{"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
登入後複製
在以下程式碼片段中,XmlRequest 欄位包含HTML-類似內容,但經過json.Marshal 編碼後,字元被轉義:

{"xmlRequest":"<car><mirror>XML</mirror></car>"}
登入後複製
產生的JSON字串為:

所需的JSON 字串為:

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
}
登入後複製

trackJSON, err := track.JSON()
登入後複製
從Go 1.7 開始,內部,內部沒有內建機制json.Marshal 禁用轉義。不過,解決方法是建立一個明確控制轉義行為的自訂函數。

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
}
登入後複製
在此自訂 JSON() 方法中,編碼器的 SetEscapeHTML 標誌設定為 false,從而停用 HTML 字元轉義。透過呼叫此方法而不是json.Marshal,可以保留原始內容而無需轉義:或者,可以透過建立一個以任何interface{} 作為輸入的函數來實現更通用的解決方案:

以上是如何在 Go 中的 JSON 封送過程中防止 `` 轉義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板