配置在 Getter/Setter 上
public class VO { private int id; @JSONField(name="ID") public int getId() { return id;} @JSONField(name="ID") public void setId(int id) {this.id = id;} }注意:若属性是私有的,必须有set*方法。否则无法反序列化。
3、使用format配置日期格式化可以定制化配置各个日期字段的格式化
public class A { // 配置date序列化和反序列使用yyyyMMdd日期格式 @JSONField(format="yyyyMMdd") public Date date; } 4、使用serialize/deserialize指定字段不序列化 public class A { @JSONField(serialize=false) public Date date; } public class A { @JSONField(deserialize=false) public Date date; } 5、使用ordinal指定字段的顺序缺省Fastjson序列化一个java bean,是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。
public static class VO { @JSONField(ordinal = 3) private int f0; @JSONField(ordinal = 2) private int f1; @JSONField(ordinal = 1) private int f2; } 6、使用serializeUsing制定属性的序列化类在fastjson 1.2.16版本之后,JSONField支持新的定制化配置serializeUsing,可以单独对某一个类的某个属性定制序列化,比如:
public static class Model { @JSONField(serializeUsing = ModelValueSerializer.class) public int value; } public static class ModelValueSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { Integer value = (Integer) object; String text = value + "元"; serializer.write(text); } }测试代码
Model model = new Model(); model.value = 100; String json = JSON.toJSONString(model); Assert.assertEquals("{\"value\":\"100元\"}", json); 使用@JSONType配置和JSONField类似,但JSONType配置在类上,而不是field或者getter/setter方法上。
通过SerializeFilter定制序列化 1、简介SerializeFilter是通过编程扩展的方式定制序列化。fastjson支持6种SerializeFilter,用于不同场景的定制序列化。
PropertyPreFilter 根据PropertyName判断是否序列化
PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
NameFilter 修改Key,如果需要修改Key,process返回值则可
ValueFilter 修改Value
BeforeFilter 序列化时在最前添加内容
AfterFilter 序列化时在最后添加内容
2、PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化 public interface PropertyFilter extends SerializeFilter { boolean apply(Object object, String propertyName, Object propertyValue); }可以通过扩展实现根据object或者属性名称或者属性值进行判断是否需要序列化。例如:
PropertyFilter filter = new PropertyFilter() { public boolean apply(Object source, String name, Object value) { if ("id".equals(name)) { int id = ((Integer) value).intValue(); return id >= 100; } return false; } }; JSON.toJSONString(obj, filter); // 序列化的时候传入filter 3、PropertyPreFilter 根据PropertyName判断是否序列化和PropertyFilter不同只根据object和name进行判断,在调用getter之前,这样避免了getter调用可能存在的异常。
public interface PropertyPreFilter extends SerializeFilter { boolean apply(JSONSerializer serializer, Object object, String name); } 4、NameFilter 序列化时修改Key如果需要修改Key,process返回值则可
public interface NameFilter extends SerializeFilter { String process(Object object, String propertyName, Object propertyValue); }fastjson内置一个PascalNameFilter,用于输出将首字符大写的Pascal风格。 例如:
import com.alibaba.fastjson.serializer.PascalNameFilter; Object obj = ...; String jsonStr = JSON.toJSONString(obj, new PascalNameFilter()); 5、ValueFilter 序列化时修改Value public interface ValueFilter extends SerializeFilter { Object process(Object object, String propertyName, Object propertyValue); } 6、BeforeFilter 序列化时在最前添加内容在序列化对象的所有属性之前执行某些操作,例如调用 writeKeyValue 添加内容
public abstract class BeforeFilter implements SerializeFilter { protected final void writeKeyValue(String key, Object value) { ... } // 需要实现的抽象方法,在实现中调用writeKeyValue添加内容 public abstract void writeBefore(Object object); } 7、AfterFilter 序列化时在最后添加内容在序列化对象的所有属性之后执行某些操作,例如调用 writeKeyValue 添加内容
public abstract class AfterFilter implements SerializeFilter { protected final void writeKeyValue(String key, Object value) { ... } // 需要实现的抽象方法,在实现中调用writeKeyValue添加内容 public abstract void writeAfter(Object object); } 通过ParseProcess定制反序列化 1、简介ParseProcess是编程扩展定制反序列化的接口。fastjson支持如下ParseProcess:
ExtraProcessor 用于处理多余的字段