項目中使用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