Golang 语言下对 Json 对象序列化的不同表现
Json.Marshal默认会对特殊字符做转义
tmp := DemoJson{
Data: "&&& | <<< | >>>",
}
raw, _ := json.Marshal(tmp)
fmt.Println(string(raw))
运行上述代码,得到的结果是:
&<>\u0026\u003c\u003e
单独设置 Json 选项避免转义
ctx := struct {
Data string
}{}
ctx.Data = "&&& | <<< | >>>"
var bb bytes.Buffer
en := json.NewEncoder(&bb)
en.SetEscapeHTML(false)
en.Encode(ctx)
fmt.Println(string(bb.Bytes()))
Python JSON 包
默认不会对&<>做转义
import json
if __name__ == '__main__':
print("带有特殊字符的 json 对象转为 str:")
data = {
"Rules": {
"CharacterType": "spec",
"Choices": "&&&&<><><><"
}
}
print(json.dumps(data, ensure_ascii = False))
print('=' * 16)
print("带有特殊字符的 json str 转为 json 对象:")
rsp = """
{"Rules": {"CharacterType": "spec", "Choices": "\u0026\u0026\u0026\u0026\u003c\u003e\u003c\u003e\u003c\u003e\u003c"}}
"""
obj = json.loads(rsp)
print(obj)
print(obj['Rules']['Choices'])
json.dumps 输出的数据如何安全的嵌入到 HTML 中
if __name__ == '__main__':
print("带有特殊字符的 json 对象转为 str:")
data = {
"Rules": {
"CharacterType": "spec",
"Choices": "&&&&<><><><"
}
}
print(json.dumps(data))
print('=' * 16)
print("使用 html 显式转义,以确保&<>可以被安全的嵌入 HTML 页面内:")
print(html.escape(json.dumps(data)))