golang - 显示字符,而不是ascii.喜欢'&',而不是'\ 0026'

hua*_*azi 15 escaping go

这是我的测试代码.只需制作一个简单的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

  • 应该使用Go 1.7中的`SetEscapeHTML`而不是手动替换字符. (3认同)

Ain*_*r-G 6

文档(我强调):

字符串值编码为 JSON 字符串。如果遇到无效的 UTF-8 序列,将返回 InvalidUTF8Error。尖括号“<”和“>”被转义为“\u003c”和“\u003e”,以防止某些浏览器将JSON输出误解为HTML。出于同样的原因,与号“&”也被转义为“\u0026”。

显然,如果您想按原样发送“&”,则需要创建自定义封送拆收器,或使用如下所示的 RawMessage 类型:http ://play.golang.org/p/HKP0eLogQX 。