前言
在很多时候,默认的序列化是不满足我们的要求的,比如:将字段全部序列化成大写等等,这时候就需要我们定制符合自己要求的序列化,fastjson支持多种方式定制序列化。
一、使用@JSONField配置
可以把@JSONField配置在字段或者getter/setter方法上。这样对象序列化的时候,就会将字段序列化成我们配置的格式
JSONField注解源码主要内容如下:
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才支持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
例如:
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方法上。
例:
// 配置序列化的时候,序列化name 和sex,不序列化使用ignores
@JSONType(includes={"name","sex"})
public class VO {}
三、通过SerializeFilter定制序列化
通过SerializeFilter可以使用扩展编程的方式实现定制序列化。fastjson提供了多种SerializeFilter:
PropertyPreFilter 根据PropertyName判断是否序列化
PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
NameFilter 修改Key,如果需要修改Key,修改process返回值则可
ValueFilter 修改Value
BeforeFilter 序列化时在最前添加内容
AfterFilter 序列化时在最后添加内容
以上的SerializeFilter在JSON.toJSONString中可以使用。
SerializeFilter filter = ...; // 可以是上面SerializeFilter的任意一种。
JSON.toJSONString(obj, filter);
下面演示一下用NameFilter 将Name全部设为大写
NameFilter nameFilter=(Object o, String name, Object value)-> name.toUpperCase();
String jsonString = JSON.toJSONString(request,nameFilter);
四、使用序列化属性SerializerFeature
SerializerFeature常用属性如下:
例:
User user = new User();
JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat)