go語言提供了json的編解碼包,json字符串作為參數(shù)值傳輸時發(fā)現(xiàn),json.Marshal生成json特殊字符、>、會被轉義。
type Test struct {
Content string
}
func main() {
t := new(Test)
t.Content = "http://www.baidu.com?id=123test=1"
jsonByte, _ := json.Marshal(t)
fmt.Println(string(jsonByte))
}
{"Content":"http://www.baidu.com?id=123\u0026test=1"}
Process finished with exit code 0
GoDoc描述
String values encode as JSON strings coerced to valid UTF-8,
replacing invalid bytes with the Unicode replacement rune.
The angle brackets “” and “>” are escaped to “\u003c” and “\u003e”
to keep some browsers from misinterpreting JSON output as HTML.
Ampersand “” is also escaped to “\u0026” for the same reason.
This escaping can be disabled using an Encoder that had SetEscapeHTML(false) alled on it.
json.Marshal 默認 escapeHtml 為true,會轉義 、>、
func Marshal(v interface{}) ([]byte, error) {
e := encodeState{}
err := e.marshal(v, encOpts{escapeHTML: true})
if err != nil {
return nil, err
}
return e.Bytes(), nil
}
解決方案
方法一:
content = strings.Replace(content, "\\u003c", "", -1)
content = strings.Replace(content, "\\u003e", ">", -1)
content = strings.Replace(content, "\\u0026", "", -1)
這種方式比較直接,硬性字符串替換。比較憨厚
方法二:
文檔中寫到This escaping can be disabled using an Encoder that had SetEscapeHTML(false) alled on it.
我們先創(chuàng)建一個buffer用于存儲json
創(chuàng)建一個jsonencoder
設置html編碼為false
type Test struct {
Content string
}
func main() {
t := new(Test)
t.Content = "http://www.baidu.com?id=123test=1"
bf := bytes.NewBuffer([]byte{})
jsonEncoder := json.NewEncoder(bf)
jsonEncoder.SetEscapeHTML(false)
jsonEncoder.Encode(t)
fmt.Println(bf.String())
}
{"Content":"http://www.baidu.com?id=123test=1"}
Process finished with exit code 0
查看文檔和源碼還是解決問題的好方法。
以上這篇golang json.Marshal 特殊html字符被轉義的解決方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- golang語言如何將interface轉為int, string,slice,struct等類型
- golang如何使用struct的tag屬性的詳細介紹
- Golang 如何解析和生成json
- golang使用json格式實現(xiàn)增刪查改的實現(xiàn)示例
- golang 實現(xiàn)struct、json、map互相轉化