第六节 使用FastJson进行对象的序列化和反序列化

亮子 2023-10-15 06:06:52 13425 0 0 0

1、FastJson简介

Fastjson是一个Java语言编写的高性能功能完善的JSON库。FastJson是阿里巴巴开源的Java对象和JSON格式字符串的快速转换的工具库,和google的Gson用法相似。

  • 高性能
    fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。并且还超越了google的二进制协议protocol buf。

  • 支持标准
    Fastjson完全支持 http://json.org的标准,也是官方网站收录的参考实现之一。

  • 功能强大
    (1)支持各种JDK类型。包括基本类型、JavaBean、Collection、Map、Enum、泛型等。
    (2)支持循环引用

  • 无依赖
    不需要例外额外的jar,能够直接跑在JDK上。

  • 支持范围广
    支持JDK 5、JDK 6、Android、阿里云手机等环境。

  • 开源
    (1)Apache License 2.0
    (2)代码托管在github.org上,项目地址是  https://github.com/AlibabaTech/fastjson

  • 测试充分
    fastjson有超过1500个testcase,每次构建都会跑一遍,丰富的测试场景保证了功能稳定。

2、获得并使用fastjson

项目地址
https://github.com/alibaba/fastjson

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.31</version>
</dependency>

由于FastJson 1.0 存在安全漏洞,已经被禁止在项目中使用,因此官方即使推出了 2.0 版本
官网地址如下:
https://github.com/alibaba/fastjson2

3、FastJson2的简介和使用

FASTJSON 2是一个性能极致并且简单易用的Java JSON库。

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

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

4、Fastjson v1兼容模块

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

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.41</version>
</dependency>

5、简单使用

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

(1)将JSON解析为JSONObject

String text = "...";
JSONObject data = JSON.parseObject(text);

byte[] bytes = ...;
JSONObject data = JSON.parseObject(bytes);

(2)将JSON解析为JSONArray

String text = "...";
JSONArray data = JSON.parseArray(text);

(3)将JSON解析为Java对象

String text = "...";
User data = JSON.parseObject(text, User.class);

(4)将Java对象序列化为JSON

Object data = "...";
String text = JSON.toJSONString(data);
byte[] text = JSON.toJSONBytes(data);

(5)使用JSONObject、JSONArray

  • 获取简单属性
String text = "{\"id\": 2,\"name\": \"fastjson2\"}";
JSONObject obj = JSON.parseObject(text);

int id = obj.getIntValue("id");
String name = obj.getString("name");
String text = "[2, \"fastjson2\"]";
JSONArray array = JSON.parseArray(text);

int id = array.getIntValue(0);
String name = array.getString(1);
  • 读取JavaBean
JSONArray array = ...
JSONObject obj = ...

User user = array.getObject(0, User.class);
User user = obj.getObject("key", User.class);
  • 转为JavaBean
JSONArray array = ...
JSONObject obj = ...

User user = obj.toJavaObject(User.class);
List<User> users = array.toJavaList(User.class);
  • 将JavaBean对象序列化为JSON
class User {
    public int id;
    public String name;
}

User user = new User();
user.id = 2;
user.name = "FastJson2";

String text = JSON.toJSONString(user);
byte[] bytes = JSON.toJSONBytes(user);

序列化结果:

{
    "id"   : 2,
    "name" : "FastJson2"
}

6、进阶使用

(1)使用JSONB

  • 将JavaBean对象序列化JSONB
User user = ...;
byte[] bytes = JSONB.toBytes(user);
byte[] bytes = JSONB.toBytes(user, JSONWriter.Feature.BeanToArray);

(2)将JSONB数据解析为JavaBean

byte[] bytes = ...
User user = JSONB.parseObject(bytes, User.class);
User user = JSONB.parseObject(bytes, User.class, JSONReader.Feature.SupportBeanArrayMapping);
  • 使用JSONPath

(1)使用JSONPath读取部分数据

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

JSONReader parser = JSONReader.of(text);
Object result = path.extract(parser);

(2)使用JSONPath读取部分byte[]的数据

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

JSONReader parser = JSONReader.of(bytes);
Object result = path.extract(parser);

(3)使用JSONPath读取部分byte[]的数据

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

JSONReader parser = JSONReader.ofJSONB(bytes); // 注意这里使用ofJSONB方法
Object result = path.extract(parser);

参考文章