jsoniter(json-iterator)是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本。从 dsljson 和 jsonparser 借鉴了大量代码。
就是快!
Go开发者们请加入我们,滴滴出行平台技术部 [email protected]
主流的 JSON 解析器是非常慢的。Jsoniter Java 版本可以比常用的 jackson/gson/fastjson 快 3 倍。如果你需要处理大量的 JSON 格式的日志,你应该考虑一下用 dsl-json 或者 Jsoniter 来节约可观的成本。根据 dsl-json 的性能评测,JSON 格式序列化和反序列化的速度其实一点都不慢,甚至比 thrift/avro 还要快。
Jsoniter 的 Golang 版本可以比标准库(encoding/json)快 6 倍之多。而且这个性能是在不使用代码生成的前提下获得的。
啥都能一行搞定!
Jsoniter 的目标就是帮你把事搞定,越快越好。最常见的用法只需要一行:
JsonStream.serialize(new int[]{1,2,3}); // from object to JSON
JsonIterator.deserialize("[1,2,3]", int[].class); // from JSON to object, with class specified
如果这就是 Jsoniter 的一切本领,那么它不过是个平庸之辈而已。然而 Jsoniter 源于作者使用现有解析器时的不满与愤怒,它绝不会别人的老路的。想要体会到 Jsoniter 的独特体验能带来什么,我们来比较一下现有常规的 JSON API 的使用体验。
根据过去的老经验,你一定知道下面这种用法是效率很低而且笨拙的,但是有些时候又不得不这么用:
Map<String, Object> obj = deserialize(input);
Object firstItem = ((List<Object>)obj.get("items")).get(0);
想要最佳的性能以及代码工整,你最好定义一个类来指定数据的格式:
public class Order {
public List<OrderEntry> items;
}
Order order = deserialize(input, Order.class);
OrderEntry firstItem = obj.items.get(0);
在写正式的业务逻辑的代码时,这当然是很好的实践。但是如果你只是想从一个JSON嵌套结构里取一个内部的字符串的值的时候,必须提前定义每层数据结构未免有点太费周章了。能一行搞定的,就别费那么些话了:
Jsoniter.deserialize(input).get("items", 0); // the first item
deserialize 的返回值类型是“Any”,它有点类似于 Map<String, Object>
。两者都是通用的数据容器,但是和 Map<String, Object>
不同,Any 有通过 api 使得数据获取上更方便:
Any any = Jsoniter.deserialize(input); // deserialize 返回 "Any",实际的解析是延迟在读取时才做的
any.get("items", '*', "name", 0); // 抽取所有 items 的第一个 name
any.get("size").toLong(); // 不管是 "100" 还是 100,都给转成 long 类型,就像弱类型一样
any.bindTo(Order.class); // 把 JSON 绑定到对象
for (Any element : any) {} // 遍历集合,Any 实现了 iterable 接口
更好的消息是,这种 schema-less 的体验在延迟解析技术的帮助下,做到了性能上的无损。所有没有别读取的字段,仍然会以 JSON 的原始格式保留。使用 Any
的性能要比使用 Map<String, Object>
好得多。现在,在 Java 语言中,你也体会到 Javascript 或者 PHP 解析 JSON 时那种丝滑般体验。JSON 与 any,乐趣多多.
Jsoniter 不仅仅在运行时要做最快的解析器,也同时非常努力地变成代码写起来最方便的解析器。
从别的库迁移过来很容易
- Golang 版本和标准库(encoding/json)完全兼容。
json.Marshal
或者json.Unmarshal
都支持,只需要把json替换为jsoniter - 支持 gson 兼容模式
- 支持 jackson 兼容模式(正在开发中)
文档
Jsoniter 功能多多,文档以例子为主。有很多代码示例来演示这些常用任务如何实现:
怎样获取
Java 版本
<dependency>
<groupId>com.jsoniter</groupId>
<artifactId>jsoniter</artifactId>
<version>0.9.19</version>
</dependency>
Go 版本
go get github.com/json-iterator/go
欢迎你的贡献
小项目bug难免,欢迎提 issue 和 pull request