Golang的json包一览

Golang的json包一览

作为程序员, 难免要和json这个小美眉打交道.
之前在拍片的时候(PHP), 可以非常粗暴的把她弄的欲仙欲死(json_decode一键电击).
可是现在收敛一点,去浪一浪的时候(Golang), 她又有点傲娇了~
下面来简单的讲一讲Golang的御妹之术(操作json)



json库分类


encoding/json

官方提供的标准json娘, 需要预定义struct,通过reflection和interface来完成工作, 性能低



go-simplejson, gabs, jason等

此类工具包依赖于encoding/json,在标准的json娘身上进行了令人发指的diy, 变得更加漂亮的同时, 提高了易用性. 不再需要预定义struct, 性能嘛~, 当然降低了许多.



easyjson, ffjson

舍弃了官方娘(encoding/json), 另辟蹊径.

不使用影响性能的reflection, 通过预先定义好的struct,进行命令行配置, 生成相关的解码/编码方法.easyjson甚至使用了unsafe的包, 来减少内存的损耗.
虽然开发成本变高了,需要额外定义struct文件和编码/解码方法文件, 但性能极速提高.有不少大公司都用easyjson替换了官方娘(encoding/json), 比如某狗东.



jsonparser

喜欢简单和扩展性, 依赖于bytes娘. json就是字符串, 那么用bytes娘不是又美好又简约吗? 易用性不但好, 而且性能是极高的.



各自的优缺点

  • encoding/json, 官方自带的, 文档最多, 易用性差, 性能差
  • go-simplejson, gabs, jason等衍生包, 简单且易用, 易于阅读, 便于维护, 但性能最差
  • easyjson, ffjson此类包, 适合固定结构的json, 易用性一般, 维护成本高, 性能特别好
  • jsonparser 适合动态和固定结构的json, 简单且易用, 维护成本低, 性能极好

以性能的高低排序: jsonparser > easyjson > encoding/json > go-simplejson, gabs, jason

性能测试, 可见jsonparser的github
buger/jsonparser

当然青菜萝卜各有所爱, 还请自行甄选.



彩蛋蛋

php和golang的json解析对比
* 数据类型精度, 以浮点型为例, 当精度过长时, php会舍弃掉这超出的部分, 而golang则会根据设置的数据类型而决定, 要比php更加精准
* 容错性, 如果json字符数据有一定的损伤, 比如数组中的某条数据结构不对. php是无法解析成功的, 而golang的容错性更好(测试使用的easyjson库), 可以解析出其他未受损的数据.

编辑于 2016-12-19