这是我的测试代码.只需制作一个简单的http服务器.然后生成一个json数据,它的值是"&".但结果是我不想要的.结果在代码块下面.
package main
import (
"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)
}
}
Run Code Online (Sandbox Code Playgroud)
结果:Chrome浏览器显示:
{ "关键": "\ u0026"}
&
控制台还显示:
{ "关键": "\ u0026"}
&
当' & '不在json中时,浏览器和控制台将打印' & '.
adr*_*lzt 16
在Go1.7中,添加了一个新选项来修复此问题:
encoding/json:add Encoder.DisableHTMLEscaping这提供了一种禁用JSON字符串中<,>和&的转义的方法.
相关功能是
func (*Encoder) SetEscapeHTML
Run Code Online (Sandbox Code Playgroud)
那应该应用于编码器.
enc := json.NewEncoder(os.Stdout)
enc.SetEscapeHTML(false)
Run Code Online (Sandbox Code Playgroud)
修改stupidbodo的例子:https://play.golang.org/p/HnWGJAjqPA
stu*_*odo 12
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type Search struct {
Query string `json:"query"`
}
func main() {
data := &Search{Query: "http://google.com/?q=stackoverflow&ie=UTF-8"}
responseJSON, _ := JSONMarshal(data, true)
fmt.Println(string(responseJSON))
}
func JSONMarshal(v interface{}, safeEncoding bool) ([]byte, error) {
b, err := json.Marshal(v)
if safeEncoding {
b = bytes.Replace(b, []byte("\\u003c"), []byte("<"), -1)
b = bytes.Replace(b, []byte("\\u003e"), []byte(">"), -1)
b = bytes.Replace(b, []byte("\\u0026"), []byte("&"), -1)
}
return b, err
}
Run Code Online (Sandbox Code Playgroud)
结果:
JSONMarshal(data, true)
{"query":"http://google.com/?q=stackoverflow&ie=UTF-8"}
JSONMarshal(data, false)
{"query":"http://google.com/?q=stackoverflow\u0026ie=UTF-8"}
Run Code Online (Sandbox Code Playgroud)
致谢:https://github.com/clbanning/mxj/blob/master/json.go#L20
Playbook:http://play.golang.org/p/c7M32gICl8