2016-07-01 29 views
0

我有一張地圖來保存json條目。這是我的代碼預覽。如何防止轉義由JSON編碼器產生的字符串中的某些字符?

mp := map[string]string{"key": "The Knight & Day"} 
fmt.Println(mp) 
bty3, err := json.Marshal(mp) 
fmt.Println(bty3, err) 
fmt.Println(string(bty3)) 

輸出爲以下各項

map[key:The Knight & Day] 
[123 34 107 101 121 34 58 34 84 104 101 32 75 110 105 103 104 116 32 92 117 48 48 50 54 32 68 97 121 34 125] <nil> 
{"key":"The Knight \u0026 Day"} 

我能以做保存特殊字符?

+3

即保留,剛剛逃脫,以防止各種客戶端的問題。這對JSON有效。 – JimB

+0

我試圖從中獲取hmac值並通過網絡發送它。其他方拋出hmac與body不匹配的異常。 – theGamblerRises

+0

每一方都需要檢查發送的數據,而不是未編碼的數據,正是因爲這樣的同構變化,更不用提可能的安全問題了。但是,如果遠程方不正確,您只需找到並替換轉義字符串。 – JimB

回答

3

encoding/json docs顯示默認轉義的字符是<,>&

您可以在這個答案使用strconv.Unquote像:How to convert escape characters in HTML tags?

簡單的東西像這樣將工作太:

bty3 = bytes.Replace(bty3, []byte(`\u003c`), []byte("<"), -1) 
bty3 = bytes.Replace(bty3, []byte(`\u003e`), []byte(">"), -1) 
bty3 = bytes.Replace(bty3, []byte(`\u0026`), []byte("&"), -1) 

在即將到來的Go1.7版本中,您可以關閉在json.Encoder逸出與SetEscapeHTML(false)

mp := map[string]string{"key": "The Knight & Day"} 
var buf bytes.Buffer 

enc := json.NewEncoder(&buf) 
enc.SetEscapeHTML(false) 
enc.Encode(mp) 

fmt.Println(&buf) 

它打印

{"key":"The Knight & Day"} 
+1

我寧願使用['strconv.Unquote()'](https://golang.org/pkg/strconv/#Unquote)像[this](https://play.golang.org/p/oNqqdb1kDB) 。查看[這個答案](http://stackoverflow.com/a/36529158/720999)瞭解更多信息。 – kostix

+0

@kostix:謝謝,我是新的,我忘記了另一種方法。 – JimB