FastJson 自定義Serialize、Parser


FastJson 自定義Serialize、Parser

今天在處理Json反序列化時,在C#傳過來的JSON字符串中枚舉類型爲int類型,FastJson對於枚舉的處理有兩種類型,一種是字符串一種是int類型,可是它自帶的解析int是按照枚舉的順序來解析的,可是有時候值不必定和順序相對應,因此使用自定義解析器方式進行解決。在網上找解決方案,沒找到詳細的方法。經過查看源代碼得出解決方案
以解析以下枚舉爲例:json

public enum Status {

    Ready(10),

    Completed(20);

    private int value;

    private Status(int value) {
        this.value = value;
    }

    public static Status create(int value) {
        switch (value) {
        case 10:
            return Status.Ready;
        case 20:
            return Status.Completed;
        default:
            throw new RuntimeException("code error");
        }
    }

    public static int value(Status status){
        return status.value;
    }
}

反序列化過程實現objectDeserializer接口,以上枚舉代碼以下:this

public class StatusDeserializer implements ObjectDeserializer {

    public <T> T deserialze(DefaultJSONParser parser, Type type,
            Object fieldName) {
        JSONLexer lexer = parser.getLexer();
        int value = lexer.intValue();
        return (T) Status.create(value);
    }

    public int getFastMatchToken() {
        // TODO Auto-generated method stub
        return 0;
    }
}

序列化過程實現ObjectSerializer接口spa

public class StatusSerializer implements ObjectSerializer{

    public void write(JSONSerializer serializer, Object object,
            Object fieldName, Type fieldType) throws IOException {
        SerializeWriter out = serializer.getWriter();
         if (object == null) {
                serializer.getWriter().writeNull();
                return;
            }
         out.write(Status.value((Status)object));
    }
}

使用自定義的序列化和反序列化的方法以下:
序列化過程code

SerializeConfig config=new SerializeConfig();
        config.put(Status.class, new StatusSerializer());
        String jsonStr=JSON.toJSONString(test,config);

反序列化過程接口

ParserConfig.getGlobalInstance().putDeserializer(Status.class, new StatusDeserializer());
        Test test1=JSON.parseObject(jsonStr,Test.class);

除了處理枚舉類型時,有時須要自定義序列化、反序列化方法外,在處理日期、時間等類型時也常常須要本身實現。字符串

相關文章
相關標籤/搜索