Golang 语言下对 Json 对象序列化的不同表现#
Json.Marshal默认会对特殊字符做转义#
1
2
3
4
5
| tmp := DemoJson{
Data: "&&& | <<< | >>>",
}
raw, _ := json.Marshal(tmp)
fmt.Println(string(raw))
|
运行上述代码,得到的结果是:

可以看到,对于字符:& < > 分别转义成了: \u0026 \u003c \u003e
单独设置 Json 选项避免转义#
1
2
3
4
5
6
7
8
9
| 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 包#
默认不会对&<>做转义#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| 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 中#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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)))
|

关于 JSON 序列化的参考资料#
RFC8259


Golang Json.Marshal 中关于 Json 序列化的说明

Python Json包中关于序列化的说明
