全解史上最快的JOSN解析库 - alibaba Fastjson (3)

配置在 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 用于处理多余的字段

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywfjd.html