Fastjson定製屬性的序列化和反序列化

gary-liu發表於2018-03-11

問題

  1. 序列化屬性時,希望在屬性值後加些說明
  2. 將屬性值中的時間戳 Timestamp 反序列化為Date 型別

方法

使用fastjson序列化時,可以在bean物件的屬性上使用註解 @JSONField 做些序列化的規則,具體使用方法見參考資料。但有時候需要一些自定義化的序列化和反序列化方式,這時可以使用 serializeUsing 和 deserializeUsing 指定屬性的序列化類和反序列化類

示例程式碼

User bean定義,指定屬性序列化和反序列化方式

public class User {

    private String name;

    @JSONField(serializeUsing = AgeVauleSerializer.class)
    private int age;

    private String desc;

    /**
     * 自定義date反序列化方式,注意序列化時也會被序列化成時間戳
     * 也可以用format="yyyy-MM-dd HH:mm:ss"定義序列化格式
     */
    @JSONField(deserializeUsing = TimestampValueDeserializer.class)
    private Date date;

    ……
    //get、set方法省略

AgeVauleSerializer 定義屬性age的序列化方式。

public class AgeVauleSerializer 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 + " year-old";
        serializer.write(text);
    }
}

TimestampValueDeserializer 定義屬性date的反序列化方式。

public class TimestampValueDeserializer implements ObjectDeserializer {

    @Override
    public Date deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        long timestamp = parser.getLexer().longValue();
        return new Date(timestamp);

    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }

}

參考資料

JSONField文件說明

相關文章