干掉 fastjson!国产新一代 fastjson 2!

举报
民工哥 发表于 2022/05/06 23:12:53 2022/05/06
【摘要】 点击下方“Java编程鸭”关注并标星 更多精彩 第一时间直达 1. FASTJSON 2.0介绍 FASTJSON 2.0是FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库,同一套API支持JSON/JSONB两种协议,JSONPath是一等公民,支持全量解析和部分解析,支持Java服务端、客户端...

点击下方“Java编程鸭”关注并标星

更多精彩 第一时间直达

1. FASTJSON 2.0介绍

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

  • FASJTONS2代码 https://github.com/alibaba/fastjson2/releases/tag/2.0.1

  • JSONB格式文档 https://github.com/alibaba/fastjson2/wiki/jsonb_format_cn

FASTJSON 2性能有了很大提升,具体性能数据看这里:

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

2. 使用前准备

2.1 Maven依赖

在fastjson 2.0中,groupId和1.x不一样,是com.alibaba.fastjson2


   
  1. <dependency>
  2.  <groupId>com.alibaba.fastjson2</groupId>
  3.  <artifactId>fastjson2</artifactId>
  4.  <version>2.0.1</version>
  5. </dependency>

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


   
  1. <dependency>
  2.   <groupId>com.alibaba</groupId>
  3.   <artifactId>fastjson</artifactId>
  4.   <version>2.0.1</version>
  5. </dependency>

2.2 常用类和方法

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


   
  1. package com.alibaba.fastjson2;
  2. class JSON {
  3.   // 将字符串解析成JSONObject
  4.   static JSONObject parseObject(String str);
  5.   // 将字符串解析成JSONArray
  6.   static JSONArray parseArray(String str);
  7.   // 将字符串解析成Java对象
  8.   static T parseObject(byte[] utf8Bytes, Class<T> objectClass);
  9.   // 将Java对象输出成字符串
  10.   static String toJSONString(Object object);
  11.   // 将Java对象输出成UT8编码的byte[]
  12.   static byte[] toJSONBytes(Object object);
  13. }
  14. class JSONB {
  15.   // 将jsonb格式的byte[]解析成Java对象
  16.   static T parseObject(byte[] jsonbBytes, Class<T> objectClass);
  17.   // 将Java对象输出成jsonb格式的byte[]
  18.   static byte[] toBytes(Object object);
  19. }
  20. class JSONObject {
  21.   Object get(String key);
  22.   int getIntValue(String key);
  23.   Integer getInteger(String key);
  24.   long getLongValue(String key);
  25.   Long getLong(String key);
  26.   T getObject(String key, Class<T> objectClass);
  27.   // 将JSONObject对象转换为Java对象
  28.   T toJavaObject(Class<T> objectClass);
  29. }
  30. class JSONArray {
  31.   Object get(int index);
  32.   int getIntValue(int index);
  33.   Integer getInteger(int index);
  34.   long getLongValue(int index);
  35.   Long getLong(int index);
  36.   T getObject(int index, Class<T> objectClass);
  37. }
  38. class JSONPath {
  39.   // 构造JSONPath
  40.   static JSONPath of(String path);
  41.   // 根据path直接解析输入,会部分解析优化,不会全部解析
  42.   Object extract(JSONReader jsonReader);
  43.   // 根据path对对象求值
  44.   Object eval(Object rootObject);
  45. }
  46. class JSONReader {
  47.   // 构造基于String输入的JSONReader
  48.   static JSONReader of(String str);
  49.   // 构造基于ut8编码byte数组输入的JSONReader
  50.   static JSONReader of(byte[] utf8Bytes);
  51.   // 构造基于char[]输入的JSONReader
  52.   static JSONReader of(char[] chars);
  53.   // 构造基于json格式byte数组输入的JSONReader
  54.   static JSONReader ofJSONB(byte[] jsonbBytes)
  55. }

3. 读取JSON对象


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

4. 将JavaBean对象生成JSON

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


   
  1. class Product {
  2.   public int id;
  3.   public String name;
  4. }
  5.   Product product = new Product();
  6. product.id = 1001;
  7.         product.name = "DataWorks";
  8.         JSON.toJSONString(product);
  9. // 生成如下的结果
  10.         {
  11.         "id" : 1001,
  12.         "name" : "DataWorks"
  13.         }
  14.         JSON.toJSONString(product, JSONWriter.Feature.BeanToArray);
  15. // 生成如下的结果
  16.         [123"DataWorks"]

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


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

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


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

5. 读取JavaBean

5.1 将字符串读取成JavaBean


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

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


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

5.3 将JSONB数据读取成JavaBean


   
  1. byte[] jsonbBytes = ...
  2.         Product product = JSONB.parseObject(jsonbBytes, Product.class);
  3.         Product product = JSONB.parseObject(jsonbBytes, Product.class, JSONReader.Feature.SupportBeanArrayMapping);

6. 使用JSONPath

6.1 使用JSONPath部分读取数据


   
  1. String str = ...;
  2.         JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能
  3.         JSONReader parser = JSONReader.of(str);
  4.         Object result = path.extract(parser);

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


   
  1. byte[] utf8Bytes = ...;
  2.         JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能
  3.         JSONReader parser = JSONReader.of(utf8Bytes);
  4.         Object result = path.extract(parser);

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


   
  1. byte[] jsonbBytes = ...;
  2.         JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能
  3.         JSONReader parser = JSONReader.ofJSONB(jsonbBytes); // 注意,这是利用ofJSONB方法
  4.         Object result = path.extract(parser);

来源:github.com/alibaba/fastjson2/releases

END


   
  1. 看完本文有收获?请转发分享给更多人
  2. 关注「Java编程鸭」,提升Java技能
  3. 关注Java编程鸭微信公众号,后台回复:码农大礼包 可以获取最新整理的技术资料一份。涵盖Java 框架学习、架构师学习等!
  4. 文章有帮助的话,在看,转发吧。
  5. 谢谢支持哟 (*^__^*)

文章来源: mingongge.blog.csdn.net,作者:民工哥,版权归原作者所有,如需转载,请联系作者。

原文链接:mingongge.blog.csdn.net/article/details/124600969

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。