Golang 语言下对 Json 对象序列化的不同表现

Json.Marshal默认会对特殊字符做转义

	tmp := DemoJson{
		Data: "&&& | <<< | >>>",
	}
	raw, _ := json.Marshal(tmp)
	fmt.Println(string(raw))

运行上述代码,得到的结果是:

json 对象特殊字符转义
&<>\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'])
python 默认不会做转义

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)))
强制 html 转义

关于 JSON 序列化的参考资料

RFC 8259 Section 7
Unicode Escape Alg
Golang Json 包中对于特殊字符转义的说明
json.dumps 中关于 ensure_ascii 参数的说明