springboot fastjson对于枚举类型的序列化和反序列化的支持

项目中使用fastjson序列化后, 发现没法对枚举类型反序列化.java

看了下源码, 序列化实现ObjectSerializer, 反序列化实现ObjectDeserializer, 在须要的地方指定便可json

FastJsonEnumSerializer.javaide

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.javacode

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;
    }

}

在须要序列化和反序列化的成员加上注解orm

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

ok. token

相关文章
相关标签/搜索