下个十年高性能 JSON 库来了:fastjson2!

21c6ed1d1fc637a330c7f152877e6611.png

作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

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

具体使用

1.添加 fastjson 2 依赖

Maven 依赖配置如下:

<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.2</version></dependency>

2.常用类和方法

package com.alibaba.fastjson2;
class JSON {// 将字符串解析成JSONObjectstatic JSONObject parseObject(String str);// 将字符串解析成JSONArraystatic JSONArray parseArray(String str);// 将字符串解析成Java对象static T parseObject(byte[] utf8Bytes, Class<T> objectClass);// 将Java对象输出成字符串static String toJSONString(Object object);// 将Java对象输出成UT8编码的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 {// 构造JSONPathstatic JSONPath of(String path);// 根据path直接解析输入,会部分解析优化,不会全部解析Object extract(JSONReader jsonReader);// 根据path对对象求值Object eval(Object rootObject);}class JSONReader {// 构造基于String输入的JSONReaderstatic JSONReader of(String str);// 构造基于ut8编码byte数组输入的JSONReaderstatic JSONReader of(byte[] utf8Bytes);// 构造基于char[]输入的JSONReaderstatic JSONReader of(char[] chars);// 构造基于json格式byte数组输入的JSONReaderstatic JSONReader ofJSONB(byte[] jsonbBytes)}

3.将字符串转换成对象

JSON 字符串转换成对象:

String str = "{\"id\":123}";
JSONObject jsonObject = JSON.parseObject(str);
int id = jsonObject.getIntValue("id");

JSON 字符串转换成数组:

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

4.将对象转换成 JSON 字符串

将对象转换成 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 字符串:

JSON.toJSONString(product, JSONWriter.Feature.BeanToArray);

以上程序执行结果如下:

[123, "DataWorks"]

性能测试报告

fastjson2、fastjson1 和 jackson 使用 JMH (Java Microbenchmark Harness) 在 JDK 8 和 JDK 11 的测试数据如下:71611a91632ead067b3eaa07e4ed2b50.png以上测试数据来自 fastjson 官网:https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark

总结

fastjson 2 相比于 fastjson 1 性能大概提升了 200%+,它的目标是成为下一个 10 年的高性能 JSON 操作工具,但如果是老项目将 fastjson 1 升级为 fastjson 2 要慎重一些,因为 fastjson 2 不保证 100% 兼容 fastjson 1。

引用 & 鸣谢

https://github.com/alibaba/fastjson2/releases

https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java面试真题解析

面试合集:https://gitee.com/mydb/interview

26e92d55ef580d3331405808799b2d42.gif

往期推荐

36d9a0040df0028db8b68c5efd8a9edd.png

顶级Javaer,常用的 14 个类库


cd879df3f76e2fc36aad90d48dc7cd67.png

Spring Boot 中实现跨域的 5 种方式,你一定要知道!


914e77ba4a26e4a85f8e65c6c664277e.png

synchronized底层是如何实现的?


9daf20a860397b4c781f49d6377191f8.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ascii非打印控制字符表_C程序打印ASCII表/图表

ascii非打印控制字符表什么是ASCII码&#xff1f; (What are ASCII Codes?) ASCII stands for American Standard Code for Information Interchange; it is a character encoding standards for information interchange in electronics communication. Each alphabets, spec…

THEOS的第一个TWeak的成功创建

THEOS的第一个TWeak的成功创建THEOS的第一个TWeak的成功创建参考资料:成功的创建一个TWeak的弹出步骤1:安装Xcode和Xcode command line步骤2:安装theosa:下载theos前,设置保存的路径:环境变量b:下载theosc:下载头文件d:下载ldid签名工具e:配置MoblieSubstrate环境f:安装dpkg步骤…

查询中,有没有可能多个索引一起用呢?

其实我们之前所讲的回表&#xff0c;就是两个索引树同时使用&#xff0c;先在二级索引树中搜索到对应的主键值&#xff0c;然后在再去主键索引树中查询完整的记录。但是我今天的问题是&#xff0c;两个不同的二级索引树&#xff0c;会同时生效吗&#xff1f;理论上来说&#xf…

ruby array_Ruby中带有示例的Array.sample()方法

ruby arrayArray.sample()方法 (Array.sample() Method) In this article, we will study about Array.sample() method. You all must be thinking the method must be doing something which is quite different from all those methods which we have studied. It is not as…

ThreadLocal夺命11连问

前言前一段时间&#xff0c;有同事使用ThreadLocal踩坑了&#xff0c;正好引起了我的兴趣。所以近期&#xff0c;我抽空把ThreadLocal的源码再研究了一下&#xff0c;越看越有意思&#xff0c;发现里面的东西还真不少。我把精华浓缩了一下&#xff0c;汇集成了下面11个问题&…

关于静态库、动态库的区别汇总

real framework中不可以使用类别 或 不可以不包含类文件real framework 中直接调用NSClassFromString函数会返回null 需要强制加载指定类 或 直接通过类名引用linux中静态库和动态库的区别一、不同库从本质上来说是一种可执行代码的二进制格式&#xff0c;可以被载入内存中执行…

PHP array_pad()函数与示例

PHP array_pad()函数 (PHP array_pad() function) array_pad() function is used to pad an array to given size with a specified value and returns a new array with a specified value. array_pad()函数用于将数组填充到具有指定值的给定大小&#xff0c;并返回具有指定值…

Spring Boot 优雅配置多数据源

大约在19年的这个时候&#xff0c;老同事公司在做医疗系统&#xff0c;需要和HIS系统对接一些信息&#xff0c;比如患者、医护、医嘱、科室等信息。但是起初并不知道如何与HIS无缝对接&#xff0c;于是向我取经。最终经过讨论采用了视图对接的方式&#xff0c;大致就是HIS系统提…

(转)新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)...

1&#xff09;ICON无法上传&#xff0c;提示图片透明&#xff08;有Alpha通道&#xff09;苹果现在不接受png里的Alpha了&#xff0c;提交的图标带有Alpha通道就提示&#xff1a;简单处理&#xff1a;用自带的预览打开&#xff0c;导出时不勾选Alpha&#xff0c;仍保存为png格式…

python 向量取整数_随机整数向量| 使用Python的线性代数

python 向量取整数Prerequisite: 先决条件&#xff1a; Defining a Vector using list 使用列表定义向量 Defining Vector using Numpy 使用Numpy定义向量 Random Integer Vector is a type of vector having a random integer value at each entry. Such types of vectors ha…

Spring 夺命 35 问!

有人说&#xff0c;“Java程序员都是Spring程序员”&#xff0c;可以看出Spring在Java世界里举足轻重的作用。基础1.Spring是什么&#xff1f;特性&#xff1f;有哪些模块&#xff1f;Spring Logo一句话概括&#xff1a;Spring 是一个轻量级、非入侵式的控制反转 (IoC) 和面向切…

Android百度地图开发03之地图控制 + 定位

前两篇关于百度地图的blog写的是&#xff0c;一些基本图层的展示 和 覆盖物的添加地理编码和反地理编码。 接下来&#xff0c;这篇blog主要说一些关于地图控制方面的内容和定位功能。 百度地图提供的关于地图的操作主要有&#xff1a;单击、双击、长按、缩放、旋转、俯视等。 地…

软件工程需要学什么_为什么我们需要软件工程?

软件工程需要学什么Software engineering is the application of the set of pre-defined procedures while developing any project. But why do we need Software engineering? What factors made us implement these predefined set of procedures and protocols while dev…

IDEA 版 Postman 面世了,功能真心强大!

IDEA是最常用的开发工具&#xff0c;很多程序员都想把它打造成一站式开发平台&#xff0c;于是安装了各种各样的插件。最近发现了一款IDEA插件RestfulFastRequest&#xff0c;细节做的真心不错&#xff0c;说它是IDEA版的Postman也不为过&#xff0c;推荐给大家&#xff01;Res…

DNS子域授权

转载于:https://blog.51cto.com/changeflyhigh/1697257

mongo数据库插入数据_深入研究Mongo数据库

mongo数据库插入数据More popularly known as "mongoDB". It is a no-sql based database. 俗称“ mongoDB” 。 这是一个基于无SQL的数据库。 BASIC STRUCTURE OF MONGO DB MONGO DB的基本结构 A COLLECTION IN MONGODB having 3 DOCUMENTS MONGODB中有3个文档的集…

java方法重载和重载方法_我们可以在Java中重载main()方法吗?

java方法重载和重载方法The question is that "can we overload main() method in Java?" 问题是“我们可以在Java中重载main()方法吗&#xff1f;” Yes, We can overload the main() method in Java. 是的&#xff0c;我们可以重载Java中的main()方法 。 JVM cal…

五分钟,手撸一个Spring容器!

Spring是我们最常用的开源框架&#xff0c;经过多年发展&#xff0c;Spring已经发展成枝繁叶茂的大树&#xff0c;让我们难以窥其全貌。这节&#xff0c;我们回归Spring的本质&#xff0c;五分钟手撸一个Spring容器&#xff0c;揭开Spring神秘的面纱&#xff01;从什么是IOC开始…

一步一步搭建客服系统 (7) 多人共享的电子白板、画板

多人共享、同时操作的电子白板&#xff0c;让不同的参入者以不同的颜色来画画&#xff1b;可以保存当前room的内容&#xff0c;以让后来者可以直接加载所有内容。 在github上找到一个用html5 canvas实现的一个电子白板的例子&#xff1a; https://github.com/kblcuk/canvas-whi…

Spring Cloud OpenFeign 的 5 个优化小技巧!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件。它的出现就是为了替代已经进入停更维护状态的 Feign&am…