首页 >后端开发 >Golang >如何阻止 Go 的 JSON 封送拆收器将 \'&\' 转换为 \'&\'?

如何阻止 Go 的 JSON 封送拆收器将 \'&\' 转换为 \'&\'?

DDD
DDD原创
2024-12-01 13:09:11994浏览

How to Stop Go's JSON Marshaler from Converting '&' to '&'?

如何防止 JSON 将 '&' 转换为 '&'?

问题场景

考虑以下代码片段:

包主</p>
<p>导入(</p>
<pre class="brush:php;toolbar:false">"encoding/json"
"fmt"
"log"
"net/http"

)

func testFunc(w http.ResponseWriter, r *http.Request) {

data := make(map[string]string)
data["key"] = "&"
bytes, err := json.Marshal(data)
if err != nil {
    fmt.Fprintln(w, "generator json error")
} else {
    //print console
    fmt.Println(string(bytes))
    fmt.Println("&")
    //print broswer
    fmt.Fprintln(w, string(bytes))
    fmt.Fprintln(w, "&")
}

}

func main () {

http.HandleFunc("/", testFunc)
err := http.ListenAndServe(":9090", nil)
if err != nil {
    log.Fatal("ListenAndServe", err)
}

}

执行此代码后,我们注意到与符号 ('&') 被转换为 &在浏览器和控制台输出中,尽管其预期显示为“&”。

解决方案

在 Go 1.7 中,引入了一个新选项来解决此问题:

func (*Encoder) SetEscapeHTML

此函数允许我们禁用 HTML 实体的转义,包括 '&'、''。

为了在示例代码中实现此解决方案,我们将 testFunc 函数修改如下:

func testFunc(w http.ResponseWriter, r *http.要求) {<pre class="brush:php;toolbar:false">...

enc := json.NewEncoder(w)
enc.SetEscapeHTML(false)

...

}

通过禁用编码器的 HTML 转义,我们确保 & 符号在 JSON 输出中保留为 '&',在浏览器和控制台中都可以。

以上是如何阻止 Go 的 JSON 封送拆收器将 \'&\' 转换为 \'&\'?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn