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);