Open houkunlin opened 1 year ago
这个的行为,在jackson中也是一样的,比如:
@Test
public void test() throws Exception {
Bean bean = new Bean();
bean.accountType = LoginAccountType.PHONE;
assertEquals("{\"accountType\":2}", JSON.toJSONString(bean));
System.out.println(new ObjectMapper().writeValueAsString(bean));
}
public static class Bean {
public LoginAccountType accountType;
}
可是在 ASM 中,Member enumValueField = BeanUtils.getEnumValueField(fieldClass, provider)
获取到了枚举类的 @com.fasterxml.jackson.annotation.JsonValue
方法对象,由于 if(enumValueField == null)
条件存在,因此导致了这本是一个枚举类,但是却没有使用 FieldWriterEnum
对象来处理
对下面代码块中的 enumValueField == null 条件判断有点疑问。
https://github.com/alibaba/fastjson2/blob/1ca0ab6f7e468cf8174ef048df3743665e9262bd/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java#L3399-L3419
我在使用 Dubbo 时,遇到一个枚举无法序列化问题,经过排查后发现,我的 enumValueField 得到了一个
getValue()
的 Method 对象,并且String[] enumAnnotationNames = BeanUtils.getEnumAnnotationNames(fieldClass);
值为null,因此这个枚举最终使用了FieldWriterObject
来处理enumValueField 的
getValue()
拿到的是使用了@com.fasterxml.jackson.annotation.JsonValue
注解的方法。在我对此代码修改后进行本地覆盖运行项目时,一切正常,我修改后的代码如下,仅仅只是调整了条件判断,我改了后我项目中的枚举能够正常序列化,但是我不知道会不会有其他未知的负面问题:
我的枚举相关类如下: