Skip to content

Commit b877fd1

Browse files
committed
fix: enum JSONType#serializer not work alibaba#2269
1 parent 27ca2b4 commit b877fd1

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterBaseModule.java

+1
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ public void getBeanInfo(BeanInfo beanInfo, Class objectClass) {
217217
Class<?> serializer = jsonType.serializer();
218218
if (ObjectWriter.class.isAssignableFrom(serializer)) {
219219
beanInfo.serializer = serializer;
220+
beanInfo.writeEnumAsJavaBean = true;
220221
}
221222

222223
Class<? extends Filter>[] serializeFilters = jsonType.serializeFilters();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.alibaba.fastjson2.issues_2200;
2+
3+
import com.alibaba.fastjson2.JSON;
4+
import com.alibaba.fastjson2.JSONReader;
5+
import com.alibaba.fastjson2.JSONWriter;
6+
import com.alibaba.fastjson2.annotation.JSONType;
7+
import com.alibaba.fastjson2.reader.ObjectReader;
8+
import com.alibaba.fastjson2.writer.ObjectWriter;
9+
import org.junit.jupiter.api.Test;
10+
11+
import java.lang.reflect.Type;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
15+
public class Issue2269 {
16+
@Test
17+
public void test() {
18+
AppDto dto = new AppDto();
19+
dto.alarmStatus = AlarmStatus.RUNNING;
20+
String str = JSON.toJSONString(dto);
21+
assertEquals("{\"alarmStatus\":\"启用\"}", str);
22+
AppDto dto1 = JSON.parseObject(str, AppDto.class);
23+
assertEquals(dto.alarmStatus, dto1.alarmStatus);
24+
}
25+
26+
@JSONType(serializer = DictSerializer.class, deserializer = DictDeserializer.class)
27+
public enum AlarmStatus {
28+
RUNNING("启用", 1),
29+
STOP("停止", 2);
30+
31+
final String name;
32+
final int value;
33+
34+
AlarmStatus(String name, int value) {
35+
this.name = name;
36+
this.value = value;
37+
}
38+
39+
}
40+
41+
static class DictSerializer implements ObjectWriter {
42+
43+
@Override
44+
public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
45+
AlarmStatus status = (AlarmStatus) object;
46+
jsonWriter.writeString(status.name);
47+
}
48+
}
49+
50+
static class DictDeserializer
51+
implements ObjectReader<AlarmStatus> {
52+
@Override
53+
public AlarmStatus readObject(JSONReader reader, Type type, Object name, long features) {
54+
if (type == null) {
55+
return null;
56+
}
57+
String str = reader.readString();
58+
switch (str) {
59+
case "启用":
60+
return AlarmStatus.RUNNING;
61+
case "停止":
62+
return AlarmStatus.STOP;
63+
default:
64+
return null;
65+
}
66+
}
67+
68+
}
69+
70+
public static class AppDto {
71+
public AlarmStatus alarmStatus;
72+
}
73+
}
74+

0 commit comments

Comments
 (0)