SerializeFilter是通過編程擴(kuò)展的方式定制序列化。fastjson支持6種SerializeFilter,用于不同場(chǎng)景的定制序列化。
public interface PropertyFilter extends SerializeFilter {
boolean apply(Object object, String propertyName, Object propertyValue);
}
可以通過擴(kuò)展實(shí)現(xiàn)根據(jù)object或者屬性名稱或者屬性值進(jìn)行判斷是否需要序列化。例如:
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); // 序列化的時(shí)候傳入filter
和PropertyFilter不同只根據(jù)object和name進(jìn)行判斷,在調(diào)用getter之前,這樣避免了getter調(diào)用可能存在的異常。
public interface PropertyPreFilter extends SerializeFilter {
boolean apply(JSONSerializer serializer, Object object, String name);
}
如果需要修改Key,process返回值則可
public interface NameFilter extends SerializeFilter {
String process(Object object, String propertyName, Object propertyValue);
}
fastjson內(nèi)置一個(gè)PascalNameFilter,用于輸出將首字符大寫的Pascal風(fēng)格。 例如:
import com.alibaba.fastjson.serializer.PascalNameFilter;
Object obj = ...;
String jsonStr = JSON.toJSONString(obj, new PascalNameFilter());
public interface ValueFilter extends SerializeFilter {
Object process(Object object, String propertyName, Object propertyValue);
}
在序列化對(duì)象的所有屬性之前執(zhí)行某些操作,例如調(diào)用 writeKeyValue 添加內(nèi)容
public abstract class BeforeFilter implements SerializeFilter {
protected final void writeKeyValue(String key, Object value) { ... }
// 需要實(shí)現(xiàn)的抽象方法,在實(shí)現(xiàn)中調(diào)用writeKeyValue添加內(nèi)容
public abstract void writeBefore(Object object);
}
在序列化對(duì)象的所有屬性之后執(zhí)行某些操作,例如調(diào)用 writeKeyValue 添加內(nèi)容
public abstract class AfterFilter implements SerializeFilter {
protected final void writeKeyValue(String key, Object value) { ... }
// 需要實(shí)現(xiàn)的抽象方法,在實(shí)現(xiàn)中調(diào)用writeKeyValue添加內(nèi)容
public abstract void writeAfter(Object object);
}
更多建議: