[BUG]@JSONField注解获取序列化获取不到LIST类型的字段,并且包含【is】前缀的boolean类型的字段,序列化丢失
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
*简要描述您碰到的问题。*
系统规范了枚举的使用方案,枚举统一使用@JSONField来处理。
并根据自己的枚举规范实现了序列化和反序列化能力。
从1升级到2后,这部分能力失效了。
表现:
使用List包装的字段,@JSONField注解并没有捕获到并给到自定义序列化处理器处理
### 环境信息
*请填写以下信息:*
- OS信息: [MacBook Pro (16-inch, 2019) 2.6 GHz 六核Intel Core i7 16 GB]
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.0.38]
### 重现步骤
*如何操作可以重现该问题:*
1. 自定义枚举序列化反序列化handler
```java
@Slf4j
public class EnumJsonHandler implements ObjectSerializer, ObjectDeserializer {
@Override
public long getFeatures() {
return ObjectSerializer.super.getFeatures();
}
@SuppressWarnings("unchecked")
@Override
public Object deserialze(DefaultJSONParser parser, Type type, Object o) {
if (Objects.isNull(type)){
throw new RuntimeException("类型为空");
}
if (type instanceof ParameterizedType) {
// 规则实现
} else {
// 规则实现
}
return null;
}
@Override
public int getFastMatchToken() {
return 0;
}
@SuppressWarnings("unchecked")
@Override
public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
}
}
```
2. 声明包含枚举的类
```
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Demo {
//问题一
@JSONField(serializeUsing = EnumJsonHandler.class, deserializeUsing = EnumJsonHandler.class)
private List demoList;
//问题二
@JSONField(alternateNames = "is_successful")
private boolean isSuccessful;
enum EnumDemo {
A,
B,
}
}
```
3. 客户端调用
```java
public static void main(String[] args) {
// 问题一
Demo demo = new Demo();
demo.setDemoList(Arrays.asList(EnumDemo.A, EnumDemo.B));
System.out.println(JSON.toJSONString(demo));
// 问题二
JSONObject object = new JSONObject();
object.put("is_successful", Boolean.TRUE);
Demo demo2 = JSONObject.toJavaObject(object,Demo.class);
System.out.println(JSON.toJSONString(demo2));
}
```
### 期待的正确结果
希望在序列化的代码中能拿到List类型的数据,根据类型来做规则处理。
### 相关日志输出
{"demoList":["A","B"]}
#### 附加信息
使用List包装的字段,@JSONField注解并没有捕获到并给到自定义序列化处理器处理
我用【2.0.39-SNAPSHOT】版本测试上一个问题的是,发现这个问题“【is】前缀字段序列化忽略的问题”已经不存在了,如果已经修复,问题二请忽略
Contributor guide
Research direction
Start by running the supplied Demo reproduction with JSONField, JSON.toJSONString, and JSONObject.toJavaObject, checking whether the custom EnumJsonHandler receives the List field and whether the is_successful alias is retained. Trace the relevant serialization and deserialization entry points, then add regression coverage showing the expected custom List handling; the boolean case may already be fixed in 2.0.39-SNAPSHOT.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend-api-design
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100