Json 如何显示字符而不是ascii?

Json 如何显示字符而不是ascii?,json,go,escaping,Json,Go,Escaping,这是我的测试代码。只需制作一个简单的HTTP服务器。然后生成其值为“&”的JSON数据。但结果是我不想要的。结果在代码块下面 package main import ( "encoding/json" "fmt" "log" "net/http" ) func testFunc(w http.ResponseWriter, r *http.Request) { data :

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

}
结果: Chrome浏览器显示:

{"key":"\u0026"}
&
控制台还显示:

{"key":"\u0026"}
&
&
不在JSON中时,浏览器和控制台将从(我强调)打印
&

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

显然,如果要按原样发送“&”,则需要创建自定义封送拆收器,或使用如下消息类型:

学分:

Playbook:

在Go1.7中,他们提供了一个新选项来解决此问题:

编码/json: add Encoder.DisableHTMLEscaping这提供了一种在JSON字符串中禁用和转义的方法

相关功能是

func (*Encoder) SetEscapeHTML
这应该应用于编码器


StupidDodo modified的示例:

解决此问题的另一种方法是在调用后,将中的转义字符简单地替换为有效的UTF-8字符

您可以使用和来执行此操作

func _UnescapeUnicodeCharactersInJSON(_jsonRaw json.RawMessage) (json.RawMessage, error) {
    str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(_jsonRaw)), `\\u`, `\u`, -1))
    if err != nil {
        return nil, err
    }
    return []byte(str), nil
}

func main() {
    // Both are valid JSON.
    var jsonRawEscaped json.RawMessage   // json raw with escaped unicode chars
    var jsonRawUnescaped json.RawMessage // json raw with unescaped unicode chars

    // '\u263a' == '☺'
    jsonRawEscaped = []byte(`{"HelloWorld": "\uC548\uB155, \uC138\uC0C1(\u4E16\u4E0A). \u263a"}`) // "\\u263a"
    jsonRawUnescaped, _ = _UnescapeUnicodeCharactersInJSON(jsonRawEscaped)                        // "☺"

    fmt.Println(string(jsonRawEscaped))   // {"HelloWorld": "\uC548\uB155, \uC138\uC0C1(\u4E16\u4E0A). \u263a"}
    fmt.Println(string(jsonRawUnescaped)) // {"HelloWorld": "안녕, 세상(世上). ☺"}
}


希望这有帮助。

好的。我刚刚编辑过。这是完整的代码。输出有什么问题?有什么问题<代码>变量o={“键”:“\u0026”};o、 key=='&'返回true。我查看了一些文档,并搜索了Google。正如您所看到的,输出并没有错,但当它作为json中的值时,我怎么能看到“&”?每次浏览器显示为\u0026时,字符串都是有效的json。参见第2.5节中的RFC。Strings如果您想支持更多utf-8字符,会是什么情况?您必须手动替换每个字符吗?我认为这不应该手工完成。。必须有另一种方法,Go 1.7中的
SetEscapeHTML
可能应该使用,而不是手动替换字符。还有其他解决方案吗?
func (*Encoder) SetEscapeHTML
enc := json.NewEncoder(os.Stdout)
enc.SetEscapeHTML(false)
func _UnescapeUnicodeCharactersInJSON(_jsonRaw json.RawMessage) (json.RawMessage, error) {
    str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(_jsonRaw)), `\\u`, `\u`, -1))
    if err != nil {
        return nil, err
    }
    return []byte(str), nil
}

func main() {
    // Both are valid JSON.
    var jsonRawEscaped json.RawMessage   // json raw with escaped unicode chars
    var jsonRawUnescaped json.RawMessage // json raw with unescaped unicode chars

    // '\u263a' == '☺'
    jsonRawEscaped = []byte(`{"HelloWorld": "\uC548\uB155, \uC138\uC0C1(\u4E16\u4E0A). \u263a"}`) // "\\u263a"
    jsonRawUnescaped, _ = _UnescapeUnicodeCharactersInJSON(jsonRawEscaped)                        // "☺"

    fmt.Println(string(jsonRawEscaped))   // {"HelloWorld": "\uC548\uB155, \uC138\uC0C1(\u4E16\u4E0A). \u263a"}
    fmt.Println(string(jsonRawUnescaped)) // {"HelloWorld": "안녕, 세상(世上). ☺"}
}