Json 如何显示字符而不是ascii?
这是我的测试代码。只需制作一个简单的HTTP服务器。然后生成其值为“&”的JSON数据。但结果是我不想要的。结果在代码块下面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 :
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": "안녕, 세상(世上). ☺"}
}