zoukankan      html  css  js  c++  java
  • 转:jsoniter-高性能的json解析器

    http://jsoniter.com/index.cn.html

    jsoniter(json-iterator)是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本。从 dsljson和 jsonparser 借鉴了大量代码。

    就是快!

    主流的 JSON 解析器是非常慢的。Jsoniter Java 版本可以比常用的 jackson/gson/fastjson 快 3 倍。如果你需要处理大量的 JSON 格式的日志,你应该考虑一下用 dsl-json 或者 Jsoniter 来节约可观的成本。根据 dsl-json 的性能评测,JSON 格式序列化和反序列化的速度其实一点都不慢,甚至比 thrift/avro 还要快

    protobuf-vs-jsoniter

    Jsoniter 的 Golang 版本可以比标准库(encoding/json)快 6 倍之多。而且这个性能是在不使用代码生成的前提下获得的。

    go-medium

    完整报告请看性能评测,对于性能优化是怎么做的有详尽的解释。

    啥都能一行搞定!

    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 不仅仅在运行时要做最快的解析器,也同时非常努力地变成代码写起来最方便的解析器。

    文档

    Jsoniter 功能多多,文档以例子为主。有很多代码示例来演示这些常用任务如何实现:

    怎样获取

    Java 版本

    <dependency>
        <groupId>com.jsoniter</groupId>
        <artifactId>jsoniter</artifactId>
        <version>0.9.8</version>
    </dependency>
    

    Go 版本

    go get github.com/json-iterator/go
    

    欢迎你的贡献

    小项目bug难免,欢迎提 issue 和 pull request

  • 相关阅读:
    Nginx之keepalived高可用工具
    Linux安装Nginx
    Nginx解决服务器宕机问题
    前端知识小札
    SQL入门(3):定义约束/断言assertion/触发器trigger
    SQL入门(2): Oracle内置函数-字符/数值/日期/转换/NVL/分析函数与窗口函数/case_decode
    Excel VBA入门(8): 快捷键/内置常量/代码调试/错误处理/代码优化
    小学生都看得懂的C语言入门(6): 字符串
    小学生都看得懂的C语言入门(5): 指针
    小学生都看得懂的C语言入门(4): 数组与函数
  • 原文地址:https://www.cnblogs.com/shine_cn/p/6380862.html
Copyright © 2011-2022 走看看