golang常用json库的选择
Sonic
如果对性能要求非常高,可以使用Sonic。但是Sonic有一些要求,高性能必然带来特例化,官方也介绍了,对CPU架构和系统等都有要求。其底层使用了一些汇编和c的代码实现,所以如果不是对性能要求特别高,可以不用。
fastjson
fastjson介绍就是非常快,不过功能相对较少。好久已经不维护了。
encoding/json
官方自带的json库。好处就是官方自带,不需要额外的第三方库。缺点就是性能不高。很多资料也都介绍了,使用了大量映射,开发便捷,牺牲了性能。并且需要指定结构体序列化出来,相对来说不够灵活。
GJSON
GJSON非常灵活,甚至可以通过通配符查找字段,其实现也说明了一切,GJSON是通过字符匹配查找的方式获取数值的。不能校验json
jsonparser
jsonparser与GJSON实现类似,通过字符匹配获取数值,不能校验json。
不能把结构体转成json
go-simplejson
go-simplejson底层是使用系统库的部分功能实现的,所以只是对系统库的封装。
easyjson
easyjson好久不维护了,并且使用起来比较麻烦,写好json对应的结构体,还要在使用easyjson转成需要的方法。
json-iterator
json-iterator的好处就是与官方的encoding/json完全兼容,不需要修改原来的代码逻辑。同样不太方便的就是必须要序列化到结构体使用。底层实现使用了与encoding/json不同的方案,所以性能比encoding/json要好。json-iterator属于比较中庸的一个json库,也是一直在维护,github上star最多的第三方json库之一,另一个是GJSON,所以如果没有特殊需求,比如高性能、多读少写、多写少读等,可以选择使用json-iterator。
go-json
也是与官方json兼容。
除此之外还有很多json库,比如ffjson等。
总结
如果只是启动读取配置文件,或者偶尔解析json,官方的encoding/json完全足够用了。如果没有特殊需求,只是正常使用,json-iterator也是不错的选择,因为其用户广泛,一直在维护,与官方json兼容
fastjson ffjson已经很久不维护了,所以排除掉
Sonic太特殊了,目前没有这种性能需求
GJSON jsonparser都是字符匹配的方式,获取数据很快,但是重复获取需要重复搜索字符
所以最终选择json-iterator作为golang的json库,因为其与官方兼容,所以写法一样,性能还有所提高,肯定要替换官方的。其他的有的是太久不维护;有的是功能不全(比如结构体和json的转换等);有的是某些场景性能好,某些场景相差比较大。