这是encoder包中的一段话
// SetEscapeHTML specifies whether problematic HTML characters
// should be escaped inside JSON quoted strings.
// The default behavior is to escape &, <, and > to \u0026, \u003c, and \u003e
// to avoid certain safety problems that can arise when embedding JSON in HTML.
//
// In non-HTML settings where the escaping interferes with the readability
// of the output, SetEscapeHTML(false) disables this behavior.
// SetEscapeHTML指定是否有问题的HTML字符
//应该在JSON引用的字符串中转义。
//默认的行为是转义&、<和>到\u0026、\u003c和\u003e
//为了避免在HTML中嵌入JSON时可能出现的某些安全问题。
//
//在非html设置中,转义会影响可读性
//对于输出,SetEscapeHTML(false)禁用此行为。
大概意思是json编码时,字符含有 &, <, and >的会被编码成 \u0026, \u003c, and \u003e,这对用户来说不是很友好,目前在go 1.13版本仍有这个问题,下面是解决方案
package main
import (
"bytes"
"encoding/json"
"fmt"
)
func main() {
data := "x < y"
raw,_ := json.Marshal(data)
fmt.Println(string(raw))
fmt.Printf("%s\n",raw)
//prints: "x \u003c y" <- probably not what you expected
var b1 bytes.Buffer
json.NewEncoder(&b1).Encode(data)
fmt.Println(b1.String())
//prints: "x \u003c y" <- probably not what you expected
var b2 bytes.Buffer
enc := json.NewEncoder(&b2)
enc.SetEscapeHTML(false)
enc.Encode(data)
fmt.Println(b2.String())
//prints: "x < y" <- looks better
}