目录

[Go] json库之sonic

前几日发布的gin v1.9.0版本json库多了个选择,就是字节开源的sonic,支持JIT(just-in-time compiling)和SIMD(single-instruction-multiple-data)加速。

本文目的就是测试go-json替换为sonic,需要哪些调整。

环境

  • go 1.20

依赖

  • Go 1.15~1.20
  • Linux/MacOS/Windows
  • Amd64 ARCH

已有用法切换

html转义

content := "https://www.baidu.com?id=12&test=23"

// go-json
gojsonByte, _ := gojson.MarshalWithOption(content, gojson.DisableHTMLEscape())

// sonic(默认不转义)
sonicByte, _ := sonic.Marshal()

// sonic转义
ret, _ := encoder.Encode(content, encoder.EscapeHTML)

看需求是否开启Escape HTML,开启后有15%性能损失。

key排序

m := map[int]string{1: "1", 11: "11", 10: "10<", 2: "c"}

// go-json
gojson_v, err := gojson.Marshal(m)
fmt.Println(string(gojson_v))

// sonic
v0, err := sonic.Marshal(m) // 输出key顺序随机、html不转义
fmt.Println(string(v0))

v1, err := sonic.ConfigDefault.Marshal(m) // 按map已有顺序输出(以效率和安全为目标)
fmt.Println(string(v1))

v2, err := sonic.ConfigFastest.Marshal(m) // 按map已有顺序输出(以速度为目标)
fmt.Println(string(v2))

v3, err := sonic.ConfigStd.Marshal(m)   // 与标准库输出一致(兼容json标准库)
fmt.Println(string(v3))

v4, err := encoder.Encode(m, encoder.SortMapKeys) // 按key排序
fmt.Println(string(v4))

看需求是否开启key排序(按字符串排序),开启后有10%性能损失。

缩进

m := map[int]string{1: "1", 11: "11", 10: "10<", 2: "c"}

// go-json
gojsonByte, _ := gojson.MarshalIndentWithOption(m, "", "\t", json.DisableHTMLEscape())

// sonic
sonicByte, _ := encoder.EncodeIndented(m, "", "\t", encoder.SortMapKeys)