1. 程式人生 > >springboot fastjson對於列舉型別的序列化和反序列化的支援

springboot fastjson對於列舉型別的序列化和反序列化的支援

專案中使用fastjson序列化後, 發現無法對列舉型別反序列化.

看了下原始碼, 序列化實現ObjectSerializer, 反序列化實現ObjectDeserializer, 在需要的地方指定即可

FastJsonEnumSerializer.java

package com.xxx.xxx.config.fastjson;

import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import com.xxx.xxx.enums.BaseEnum;

import java.lang.reflect.Type;

public class FastJsonEnumSerializer implements ObjectSerializer {

    @Override
    public void write(JSONSerializer serializer, Object object, Object fileName, Type type, int features) {
        SerializeWriter out = serializer.out;
        if (object instanceof BaseEnum) {
            BaseEnum baseEnum = (BaseEnum) object;
            out.write(baseEnum.getCode().toString());
        } else {
            out.writeEnum((Enum<?>) object);
        }
    }

}

FastJsonEnumDeserializer.java

package com.xxx.xxx.config.fastjson;

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.JSONToken;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import com.xxx.xxx.enums.BaseEnum;

import java.lang.reflect.Type;

public class FastJsonEnumDeserializer implements ObjectDeserializer {

    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object o) {
        final JSONLexer lexer = parser.lexer;
        final int token = lexer.token();
        Class cls = (Class) type;
        Object[] enumConstants = cls.getEnumConstants();
        if (BaseEnum.class.isAssignableFrom(cls)) {
            for (Object enumConstant : enumConstants) {
                BaseEnum<Integer> baseEnum = (BaseEnum<Integer>) enumConstant;
                Object enumCodeObject = baseEnum.getCode();
                int enumCode = Integer.parseInt(enumCodeObject.toString());
                if (lexer.intValue() == enumCode) {
                    return (T) baseEnum;
                }
            }
        } else {
            //沒實現EnumValue介面的 預設的按名字或者按ordinal
            if (token == JSONToken.LITERAL_INT) {
                int intValue = lexer.intValue();
                lexer.nextToken(JSONToken.COMMA);
                if (intValue < 0 || intValue > enumConstants.length) {
                    throw new JSONException(String.format("parse enum %s error, value : %s", cls.getName(), intValue));
                }
                return (T) enumConstants[intValue];
            } else if (token == JSONToken.LITERAL_STRING) {
                return (T) Enum.valueOf(cls, lexer.stringVal());
            }
        }
        return null;
    }

    @Override
    public int getFastMatchToken() {
        return JSONToken.LITERAL_INT;
    }

}

在需要序列化和反序列化的成員加上註解


@JSONField(serializeUsing = FastJsonEnumSerializer.class, deserializeUsing = FastJsonEnumDeserializer.class)
private StatusEnum status;

ok.