alibaba / alibaba/fastjson2

[BUG]@JSONField注解获取序列化获取不到LIST类型的字段,并且包含【is】前缀的boolean类型的字段,序列化丢失

Open
#1,733 0 comments 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.