Skip to content

JSON解析库(Fastjson)

概述

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。 已经被广泛使用在各种场景,包括cache存储、RPC通讯、MQ通讯、网络协议通讯、Android客户端、Ajax服务器处理程序等等。

特点

速度快、适用范围广、使用方式简单、功能完备

适用范围

Pangea v2.0.1.3+

快速上手

在业务模块的pom文件中添加依赖:

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

注意

目前框架支持的Fastjson的版本为1.2.68,已经集成到框架中,不需要额外引用。

常用API

序列化API

html
public abstract class JSON {
    // 将Java对象序列化为JSON字符串,支持各种各种Java基本类型和JavaBean
    public static String toJSONString(Object object, SerializerFeature... features);

    // 将Java对象序列化为JSON字符串,返回JSON字符串的utf-8 bytes
    public static byte[] toJSONBytes(Object object, SerializerFeature... features);

    // 将Java对象序列化为JSON字符串,写入到Writer中
    public static void writeJSONString(Writer writer, Object object, SerializerFeature... features);

    // 将Java对象序列化为JSON字符串,按UTF-8编码写入到OutputStream中
    public static final int writeJSONString(OutputStream os, Object object, SerializerFeature... features);
}

反序列化API

html
public abstract class JSON {
    // 将JSON字符串反序列化为JavaBean
    public static <T> T parseObject(String jsonStr, Class<T> clazz, Feature... features);

    // 将JSON字符串反序列化为JavaBean
    public static <T> T parseObject(byte[] jsonBytes, Class<T> clazz, Feature... features); // UTF-8格式的JSON字符串

    // 将JSON字符串反序列化为泛型类型的JavaBean
    public static <T> T parseObject(String text, TypeReference<T> type, Feature... features);

    // 将JSON字符串反序列为JSONObject
    public static JSONObject parseObject(String text);
}

@JSONField

注意

若属性是私有的,必须有set*方法。否则无法反序列化。

html
public @interface JSONField {
    // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
    int ordinal() default 0;

     // 指定字段的名称
    String name() default "";

    // 指定字段的格式,对日期格式有用
    String format() default "";

    // 是否序列化
    boolean serialize() default true;

    // 是否反序列化
    boolean deserialize() default true;
}

配置方式

1.getter/setter上

html
 public class A {
      private int id;

      @JSONField(name="ID")
      public int getId() {return id;}
      @JSONField(name="ID")
      public void setId(int value) {this.id = id;}
 }

2.field上

html
 public class A {
      @JSONField(name="ID")
      private int id;

      public int getId() {return id;}
      public void setId(int value) {this.id = id;}
 }

3.使用format配置日期格式化

html
 public class A {
      // 配置date序列化和反序列使用yyyyMMdd日期格式
      @JSONField(format="yyyyMMdd")
      public Date date;
 }

4.使用serialize/deserialize指定字段不序列化

5.使用ordinal指定字段的顺序

缺省fastjson序列化一个java bean,是根据fieldName的字母序进行序列化的,可以通过ordinal指定字段的顺序

JSONPath

可以在java框架中当作对象查询语言(OQL)来使用

html
public class JSONPath {          
     //  求值,静态方法
     public static Object eval(Object rootObject, String path);

     // 计算Size,Map非空元素个数,对象非空元素个数,Collection的Size,数组的长度。其他无法求值返回-1
     public static int size(Object rootObject, String path);

     // 是否包含,path中是否存在对象
     public static boolean contains(Object rootObject, String path) { }

     // 是否包含,path中是否存在指定值,如果是集合或者数组,在集合中查找value是否存在
     public static boolean containsValue(Object rootObject, String path, Object value) { }

     // 修改制定路径的值,如果修改成功,返回true,否则返回false
     public static boolean set(Object rootObject, String path, Object value) {}

     // 在数组或者集合中添加元素
     public static boolean array_add(Object rootObject, String path, Object... values);
}

方法解析

定制序列化

  • 通过@JSONField定制序列化 可以在set和get方法上增加注解
html
第一种方式:
 public class VO {
      @JSONField(name="ID")
      private int id;
 }

第二种方式:
 public class VO {
      private int id;

      @JSONField(name="ID")
      public int getId() { return id;}

      @JSONField(name="ID")
      public void setId(int value) {this.id = id;}
 }
  • 通过@JSONType定制序列化

    和JSONField类似,但JSONType配置在类上,而不是field或者getter/setter方法上。

  • 通过SerializeFilter定制序列化 可以使用扩展编程的方式实现定制序列化。Fastjson提供了多种SerializeFilter:

    1)PropertyPreFilter 根据PropertyName判断是否序列化

    2)PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化

    3)NameFilter 修改Key,如果需要修改Key,process返回值则可

    4)ValueFilter 修改Value

    5)BeforeFilter 序列化时在最前添加内容

    6)AfterFilter 序列化时在最后添加内容

    以上的SerializeFilter在JSON.toJSONString中可以使用。

html
  SerializeFilter filter = ...; // 可以是上面5个SerializeFilter的任意一种。
  JSON.toJSONString(obj, filter);
  • 通过ParseProcess定制反序列化

    编程扩展定制反序列化的接口,Fastjson支持如下ParseProcess:

    ExtraProcessor 用于处理多余的字段

    ExtraTypeProvider 用于处理多余字段时提供类型信息

系列化反系列化方法

Fastjson 提供了Spring MVC HttpMessageConverter的实现。可用于在Spring Controller中使用Fastjson进行数据的Serialize and Deserialize。

循环引用

Fastjson支持循环引用,并且是缺省打开的。

  • 全局配置关闭
html
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
  • 非全局关闭
html
  JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

常见问题

1.Fastjson主要的API哪些 Fastjson入口类是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString和parseObject、序列化、反序列化和泛型反序列化。

2.Fastjson如何处理日期
Fastjson通过API处理日期

html
JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")

//使用ISO-8601日期格式
JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);

//全局修改日期格式
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

参考文档

1、Fastjson 使用指南