前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >笔记:JSON 序列化时特殊字符转义现象的记录

笔记:JSON 序列化时特殊字符转义现象的记录

原创
作者头像
bowenerchen
发布2024-05-17 15:40:07
9238
发布2024-05-17 15:40:07
举报
文章被收录于专栏:编码视界数安视界

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

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

代码语言:golang
复制
	tmp := DemoJson{
		Data: "&&& | <<< | >>>",
	}
	raw, _ := json.Marshal(tmp)
	fmt.Println(string(raw))

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

json 对象特殊字符转义
json 对象特殊字符转义

可以看到,对于字符:& < > 分别转义成了: \u0026 \u003c \u003e

单独设置 Json 选项避免转义

代码语言:golang
复制
	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 包

默认不会对&<>做转义

代码语言:python
代码运行次数:0
复制
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 默认不会做转义
python 默认不会做转义

json.dumps 输出的数据如何安全的嵌入到 HTML 中

代码语言:python
代码运行次数:0
复制
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 转义
强制 html 转义

关于 JSON 序列化的参考资料

RFC8259

RFC 8259 Section 7
RFC 8259 Section 7
Unicode Escape Alg
Unicode Escape Alg

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

Golang Json 包中对于特殊字符转义的说明
Golang Json 包中对于特殊字符转义的说明

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

json.dumps 中关于 ensure_ascii 参数的说明
json.dumps 中关于 ensure_ascii 参数的说明

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Golang 语言下对 Json 对象序列化的不同表现
    • Json.Marshal默认会对特殊字符做转义
      • 单独设置 Json 选项避免转义
      • Python JSON 包
        • 默认不会对&<>做转义
          • json.dumps 输出的数据如何安全的嵌入到 HTML 中
          • 关于 JSON 序列化的参考资料
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档