【发布时间】:2020-06-20 20:05:31
【问题描述】:
用户将{"lang": ["en_US", "en_UK"]} 发布到 REST API。我想填充一个具有此属性List<EnmLanguage> lang; 的对象。除了 JSON 数组之外,其他一切都有效。
我的 EnmLanguage.java 是:
@JsonSerialize(
using = BaseEnumSerializer.class
)
@JsonDeserialize(
using = BaseEnumDeserializer.class
)
public enum EnmLanguage implements BaseEnum, Serializable {
en_US {
public String getCode() {
return "en_US";
}
public String getText(EnmLanguage s) {
return s == EnmLanguage.en_US ? "English" : "İngilizce";
}
},
我的 BaseEnum.java 是:
public interface BaseEnum {
Object getCode();
String getText(EnmLanguage lang);
default String getText() {
return this.getText(EnmLanguage.tr_TR);
}
default Map<String, Object> getMap(EnmLanguage lang) {
return new HashMap<String, Object>() {
{
this.put("name", BaseEnum.this.getText(lang));
this.put("id", BaseEnum.this.getCode());
}
};
}
default Map<String, Object> getMap() {
return this.getMap(EnmLanguage.tr_TR);
}
static <T extends Enum<T> & BaseEnum> T fromCode(Class<T> parent, Object code) {
Map<Object, T> lookup = new HashMap();
Enum[] var3 = (Enum[])parent.getEnumConstants();
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
T d = var3[var5];
lookup.put(((BaseEnum)d).getCode().toString(), d);
}
return (Enum)lookup.get(code.toString());
}
}
我的 BaseEnumDeseraliazer 是:
public class BaseEnumDeserializer<T extends Enum<T> & BaseEnum> extends StdDeserializer<T> {
public BaseEnumDeserializer() {
this((Class)null);
}
public BaseEnumDeserializer(Class<T> vc) {
super(vc);
}
public T deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException {
Field field = this.findField(jsonparser.getCurrentName(), jsonparser.getCurrentValue().getClass());
Class<T> javaType = field.getType();
return BaseEnum.fromCode(javaType, jsonparser.getText());
}
public Field findField(String name, Class<?> c) {
while(c != null) {
Field[] var3 = c.getDeclaredFields();
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
Field field = var3[var5];
if (!Modifier.isStatic(field.getModifiers()) && field.getName().equals(name)) {
return field;
}
}
c = c.getSuperclass();
}
return null;
}
}
但最后它不会将"lang": ["en_US", "en_UK"] 转换为EnmLanguage 的List。我认为它不知道BaseEnum 转换为哪个。我应该如何让它知道它应该将其转换为List<EnmLanguage>?
【问题讨论】:
-
ObjectMapper是如何配置的?听起来这可能是 Spring Rest?反序列化过程中是否出现异常?
-
你好,你能给你的变量(var3、var4、var5...)提供人类可读的(和驼峰式)名称吗?
-
为什么需要
BaseEnum? -
@IndraBasak 以便项目中的所有枚举都有标准方法。
-
@IndraBasak,我还有几个实现
BaseEnum的枚举
标签: java serialization jackson