不破不立!Fastjson2.0 性能炸裂,为了下一个十年

简介: Alibaba Fastjson: 目前在人类已知范围内,这个星球跑的最快的Java JSON库。在过去的十年里,fastjson v1作为国内github star最多和最受欢迎的json解析库,如今fastjson v2 重磅来袭,性能炸裂。

logo.jpg

1. FASTJSON v2介绍

FASTJSON v2是FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库。通过同一套API支持JSON/JSONB两种协议,JSONPath是一等公民,支持全量解析和部分解析,支持Java服务端、客户端Android、大数据场景。

2. 使用前准备

2.1 Maven依赖

fastjson v2中,groupId1.x不一样,是com.alibaba.fastjson2

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.x.x</version>
</dependency>
可以在 maven.org 查看最新可用的版本。

2.2 fastjson v1的兼容包

如果原来使用fastjson 1.2.x版本,可以使用兼容包,兼容包不能保证100%兼容,请仔细测试验证,发现问题请及时反馈。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.x.x</version>
</dependency>

2.3 常用类和方法

fastjson v2中,package1.x不一样,是com.alibaba.fastjson2。如果你之前用的是fastjson1,大多数情况直接更包名就即可。

package com.alibaba.fastjson2;

class JSON {
    // 将字符串解析成JSONObject
    static JSONObject parseObject(String str);

    // 将字符串解析成JSONArray
    static JSONArray parseArray(String str);

    // 将字符串解析成Java对象
    static T parseObject(byte[] utf8Bytes, Class<T> objectClass);

    // 将Java对象输出成字符串
    static String toJSONString(Object object);

    // 将Java对象输出成UTF8编码的byte[]
    static byte[] toJSONBytes(Object object);
}

class JSONB {
    // 将jsonb格式的byte[]解析成Java对象
    static T parseObject(byte[] jsonbBytes, Class<T> objectClass);

    // 将Java对象输出成jsonb格式的byte[]
    static byte[] toBytes(Object object);
}

class JSONObject {
    Object get(String key);
    int getIntValue(String key);
    Integer getInteger(String key);
    long getLongValue(String key);
    Long getLong(String key);
    T getObject(String key, Class<T> objectClass);

    // 将JSONObject对象转换为Java对象
    T toJavaObject(Class<T> objectClass);
}

class JSONArray {
    Object get(int index);
    int getIntValue(int index);
    Integer getInteger(int index);
    long getLongValue(int index);
    Long getLong(int index);
    T getObject(int index, Class<T> objectClass);
}

class JSONPath {
    // 构造JSONPath
    static JSONPath of(String path);

    // 根据path直接解析输入,会部分解析优化,不会全部解析
    Object extract(JSONReader jsonReader);

    // 根据path对对象求值
    Object eval(Object rootObject);
}

class JSONReader {
    // 构造基于String输入的JSONReader
    static JSONReader of(String str);

    // 构造基于utf8编码byte数组输入的JSONReader
    static JSONReader of(byte[] utf8Bytes);

    // 构造基于char[]输入的JSONReader
    static JSONReader of(char[] chars);

    // 构造基于json格式byte数组输入的JSONReader
    static JSONReader ofJSONB(byte[] jsonbBytes)
}

3. 读取JSON对象

String str = "{\"id\":123}";
JSONObject jsonObject = JSON.parseObject(str);
int id = jsonObject.getIntValue("id");
String str = "[\"id\", 123]";
JSONArray jsonArray = JSON.parseArray(str);
String name = jsonArray.getString(0);
int id = jsonArray.getIntValue(1);

4. 将JavaBean对象生成JSON

4.1 将JavaBean对象生成JSON格式的字符串

class Product {
    public int id;
    public String name;
}

Product product = new Product();
product.id = 1001;
product.name = "DataWorks";

JSON.toJSONString(product);

// 生成如下的结果
{
    "id"   : 1001,
    "name" : "DataWorks"
}

JSON.toJSONString(product, JSONWriter.Feature.BeanToArray);
// 生成如下的结果
[1001, "DataWorks"]

4.2 将JavaBean对象生成UTF8编码的byte[]

Product product = ...;
byte[] utf8JSONBytes = JSON.toJSONBytes(product);

4.3 将JavaBean对象生成JSONB格式的byte[]

Product product = ...;
byte[] jsonbBytes = JSONB.toBytes(product);

byte[] jsonbBytes = JSONB.toBytes(product, JSONWriter.Feature.BeanToArray);

5. 读取JavaBean

5.1 将字符串读取成JavaBean

String str = "{\"id\":123}";
Product product = JSON.parseObject(str, Product.class);

5.2 将UTF8编码的byte[]读取成JavaBean

byte[] utf8Bytes = "{\"id\":123}".getBytes(StandardCharsets.UTF_8);
Product product = JSON.parseObject(utf8Bytes, Product.class);

5.3 将JSONB数据读取成JavaBean

byte[] jsonbBytes = ...
Product product = JSONB.parseObject(jsonbBytes, Product.class);

Product product = JSONB.parseObject(jsonbBytes, Product.class, JSONReader.Feature.SupportBeanArrayMapping);

6. 使用JSONPath

6.1 使用JSONPath部分读取数据

String str = ...;

JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能

JSONReader parser = JSONReader.of(str);

Object result = path.extract(parser);

6.2 使用JSONPath读取部分utf8Bytes的数据

byte[] utf8Bytes = ...;

JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能

JSONReader parser = JSONReader.of(utf8Bytes);

Object result = path.extract(parser);

6.3 使用JSONPath读取部分jsonbBytes的数据

byte[] jsonbBytes = ...;

JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能

JSONReader parser = JSONReader.ofJSONB(jsonbBytes); // 注意,这是利用ofJSONB方法

Object result = path.extract(parser);

7. FASTJSON v2应用场景

7.1 服务端应用场景

  1. 高性能
  2. 定制化序列化/反序列化
  3. 支持模块化,按需装载
  4. 针对JDK 8/JDK 9不同的字符串实现优化
  5. 静态化加速
  6. 安全,不能有反序列化安全问题
  7. 同一套API支持JSON/JSONB两种协议

7.2 大数据应用场景

  1. 部分解析
  2. JSONPath是一等公民

7.3 Android应用场景

  1. 首次执行性能要足够好
  2. 静态化加速
  3. 同一套API支持JSON/JSONB两种协议

8. FASTJSON v2相关设计

8.1 Reader类结构

image.png

8.2 Writer类结构

image.png

8.3 解析关键算法

image.png
image.png

了解更多详见Github地址: https://github.com/alibaba/fastjson2
相关文章
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
小说中修仙系统的方向统计_IT修仙_人工智能的底层逻辑
小说中修仙系统的方向统计_IT修仙_人工智能的底层逻辑
116 0
|
8月前
|
消息中间件 缓存 Java
牛掰!阿里人用7部分讲明白百亿级高并发系统(全彩版小册开源)
高并发 提到“高并发”相信你们应该都不会感到陌生!此时你脑中应该会浮现好多有关高并发的:业务急剧增长、电商购物、电商秒杀、12306抢票、淘宝天猫各种活动等;都是需要用到高并发的,那么如何去设计一个高并发系统抵挡这些冲击呢? 其实这也是一道很常见的面试题,但是大多数应聘者都不知如何回答,从何答起。对于一个Java程序员来讲,,更关注的是不是系统架构层面的呢?从原本的定时秒杀,到现在各种活动的预热、拼团、定金膨胀、百亿补贴、跨店满减以及更复杂的组合优惠,让用户摸不到头脑,虽然这些都扰乱了用户购买的节奏,但是也一直保持着持续升温的状态。
|
9月前
|
Java
这几个常用的工具类,让你生产力爆表!
这几个常用的工具类,让你生产力爆表!
41 0
|
程序员 测试技术 开发者
以中国传统的孔子和老子的思想分析忍者代码
以中国传统的孔子和老子的思想分析忍者代码
629 0
以中国传统的孔子和老子的思想分析忍者代码
|
存储 缓存 运维
完爆 90% 的性能毛病,22 点通用绝招介绍(二)
完爆 90% 的性能毛病,22 点通用绝招介绍(二)
完爆 90% 的性能毛病,22 点通用绝招介绍(二)
|
存储 NoSQL 算法
完爆 90% 的性能毛病,22 点通用绝招介绍(一)
完爆 90% 的性能毛病,22 点通用绝招介绍(一)
完爆 90% 的性能毛病,22 点通用绝招介绍(一)
|
JSON 算法 fastjson
Fastjon2他来了,性能显著提升,还能再战十年
阿里官方给的定义是,FASTJSON是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
482 1
|
SQL 缓存 监控
这波性能优化,太炸裂了!(下)
这波性能优化,太炸裂了!(下)
126 0
这波性能优化,太炸裂了!(下)
|
Java 编译器 测试技术
这波性能优化,太炸裂了!(上)
这波性能优化,太炸裂了!(上)
159 0
这波性能优化,太炸裂了!(上)
|
Java C++
这波性能优化,太炸裂了!(中)
这波性能优化,太炸裂了!(中)
127 0
这波性能优化,太炸裂了!(中)