阿里FastJson的使用

本文介绍了阿里巴巴的FastJson,它是Java最快的JSON库。详细讲述了如何添加依赖、主要API接口、日期类型的处理以及定制序列化。FastJson在Spring MVC和Spring Data Redis中的集成也进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阿里FastJson的使用

标签(空格分隔): java FastJson 序列化


一、什么是FastJson

    fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。

二、FastJson的简单入门

1. 添加FastJson的依赖到项目中

1.1 通过Maven来获取依赖FastJson。
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version> ${version}</version>
 </dependency>

其中${version}替换为相应版本就可以了。目前最新的版本是1.2.39。

2. fastjson的主要API接口方法。

在fastjson API中,最核心的类就是com.alibaba.fastjson.JSON这个类,里面包含了许多大部分开发使用场景下常用的java bean或者map的序列化、反序列化的方法。其中最常用的就是toJSONString和parseObject()这两个序列化和反序列化方法。

package com.alibaba.fastjson;
public abstract class JSON {
  public static final String toJSONString(Object object);
  public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
  }

序列化

String jsonString = JSON.toJSONString(obj);

反序列化:

VO vo = JSON.parseObject("...", VO.class);

泛型反序列化:

import com.alibaba.fastjson.TypeReference;
List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});

3. 一个简单的完整实例

3.1 定义一个Java 实体类User,然后定义一个Vo类代表一个数据传输bean.

User.java

//只列出核心代码
public class User {
private Long id;
private String name;
private Date birthday;
public User(){}
public User(Long id,String name){
    this.id=id;
    this.name=name;
    this.birthday= DateUtils.getCurrentDate();//2017-11-01
    System.out.println(birthday.getTime());
}
、、、、、、省略getter、setter,toString方法
}

Vo.java

public class Vo {
    private Long id;
    private List<User> userList;
    private Map<String,Object> data;
    public Vo(){}
    public Vo(Long id){
        this.id=id;
    }
    、、、、、、省略getter、setter,toString方法
}
3.2 通过TestNg进行测试
@Test
public void testFastJsonSerializeAndDeserialize(){
    User user1=new User(1L,"licho");
    List<User> userList=new ArrayList<>();
    userList.add(user1);
    Map<String,Object> data=new HashMap<>();
    User user2=new User(1L,"licho");
    data.put("user",user2);
    Vo resultData=new Vo(2L);
    resultData.setUserList(userList);
    resultData.setData(data);
    String str=JSON.toJSONString(resultData);//序列化结果
    System.out.println(str);
    Vo deserialize=JSON.parseObject(str,Vo.class);//反序列化结果
    System.out.println(deserialize);
}

测试结果如下:

{"data":{"user":{"birthday":1509465600000,"id":1,"name":"licho"}},"id":2,"userList":[{"birthday":1509465600000,"id":1,"name":"licho"}]}
Vo{id=2, userList=[User{id=1, name='licho', birthday=Wed Nov 01 00:00:00 GMT+08:00 2017}], data={user={"birthday":1509465600000,"name":"licho","id":1}}}

    由结果可以看出,fastjson序列化后的字符串是符合Json规范的。对于属性名即key,都通过双引号包裹,对于布尔以及数字类型序列化value值是不加双引号的,对于集合类型例如List,Set是序列化为array类型,即[]代表一个集合列表,对于Object类型是获取其符合Java Bean规范的属性键和值。字符串类型同样使用双引号包裹。

但是不知道大家有没有发现,对于Date这个我们经常使用的日期类型的序列化,它序列化后的结果是一个数字类型,这个值也就是从1970 年 1 月 1 日开始计算到Date对象所表示时间经过的毫秒数。但是这显然不是我们希望看到的结果,我们想要的应该是经过格式化的时间结果。下面我们就来看看Fastjson日期对象的处理。

三、FastJson对日期类型的处理

1. 序列化时控制Date类型的输出格式

  • 直接指定pattern日期格式

    JSON.toJSONStringWithDateFormat(resultDate, "yyyy-MM-dd HH:mm:ss.SSS")
    
  • 使用ISO-8601日期格式

    JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);
    
  • 全局修改日期格式,这个DEFAULT_DATE_FORMAT变量是JSON.toJsonString(obj,SerializerFeature)方法对于Date类型的对象的默认序列化格式。我们可以通过改变这个变量值来指定date类型的序列化格式。

    JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
    JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
    

2. 反序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值