一、時間格式序列化
1、時間格式化
JSONObject.toJSONStringWithDateFormat(time, "yyyy-MM-dd HH:mm:ss")
Fastjson可以直接對Date類型進行格式化輸出,格式化方法調用了Java標準庫DateFormat的格式化方法,自行傳入自定義的解析規則即可。
2、JSONField
public class Person {
@JSONField(format="yyyy-MM-dd")
private Date birthday;
//...
}
使用JSONField註解的format屬性可以直接對Date類型進行格式化輸出。
3、JSONType
@JSONType (dateFormat = "yyyy-MM-dd HH:mm:ss")
public class Person {
private Date createTime;
//...
}
通過JSONType註解實現類級別的日期格式化。
二、優化輸出性能
1、緩存反射信息
public class User {
private int id;
private String name;
//...
private static final SerializeConfig config = new SerializeConfig();
static {
config.put(User.class, new UserSerializer());
}
}
Fastjson為每個類的序列化都會創建一個序列化器,序列化器的創建會涉及到反射機制,創建序列化器的過程是比較耗時的。如果需要對同一類型的數據進行反覆序列化,則可以使用靜態的變量來緩存序列化的配置信息,避免反射機制的開銷。
2、指定序列化順序
public class User {
private int id;
private String name;
//...
static class IdNameSerializer implements JavaBeanSerializer {
public final void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
SerializeWriter out = serializer.out;
User user = (User) object;
Integer id = user.getId();
String name = user.getName();
if ((features & SerializerFeature.SortField.mask) != 0) {
out.write('{');
serializer.out.writeFieldName("id");
serializer.out.writeInt(id);
serializer.out.write(',');
serializer.out.writeFieldName("name");
serializer.out.writeString(name);
serializer.out.write('}');
} else {
out.write('{');
out.writeFieldName("name");
serializer.write(name);
out.write(',');
out.writeFieldName("id");
out.writeInt(id);
out.write('}');
}
}
}
}
Fastjson對於JavaBean的序列化順序默認採用ASCII碼順序,可以使用SortFeild序列話屬性控制輸出順序。此外,也可以編寫自定義序列化器來制定輸出順序。
三、自定義輸出
1、ValueFilter
ValueFilter valueFilter = new ValueFilter() {
public Object process(Object obj, String s, Object v) {
if(v == null) {
return "";
}
return v;
}
};
String jsonString = JSONObject.toJSONString(map, valueFilter);
通過實現ValueFilter接口,可以在序列化過程中動態改變某些Bean屬性的值。
2、PropertyFilter
PropertyFilter propertyFilter = new PropertyFilter() {
public boolean apply(Object object, String name, Object value) {
if(name.equalsIgnoreCase("password")){
return false;
}
return true;
}
};
String jsonString = JSONObject.toJSONString(user, propertyFilter);
通過實現PropertyFilter接口,可以過濾不想序列化的Bean屬性。
3、SerializeFilter
public class ValueLabelFilter implements NameFilter {
private Object value;
private String label;
public ValueLabelFilter(Object value, String label) {
this.value = value;
this.label = label;
}
public String process(Object source, String name, Object value) {
if (this.value.equals(value)) {
return this.label;
}
return name;
}
}
ValueLabelFilter filter = new ValueLabelFilter(0, "男");
SerializeFilter[] filters = {filter};
String jsonString = JSONObject.toJSONString(user, filters);
通過實現SerializeFilter接口,可以控制序列化過程中修改每個屬性序列化時的過濾要求,一般同時實現NameFilter、ValueFilter、PropertyFilter三個接口。
四、異常處理
1、關閉循環引用檢測
JSON.toJSONString(xxx, SerializerFeature.DisableCircularReferenceDetect)
默認情況下,Fastjson會檢測到循環引用並拋出異常,如果不需要對循環引用進行處理,則可以禁用此項檢測。
2、定製異常處理器
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
public class MyExceptionHandler implements ExceptionHandler {
@Override
public void handle(Exception ex) {
throw new MyException(ex);
}
@Override
public void handle(Exception ex, Object obj, Object fieldName) {
throw new MyException(ex);
}
}
SerializeWriter out = new SerializeWriter();
JSONSerializer serializer = new JSONSerializer(out);
serializer.setExceptionHandler(new MyExceptionHandler());
serializer.write(jsonObject);
如果Fastjson序列化過程中出現異常,則會自動調用默認的異常處理器,將異常信息打印出來。但是,你也可以定製自己的異常處理器,來處理Fastjson發生的異常。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190977.html
微信掃一掃
支付寶掃一掃