alibaba / alibaba/fastjson2

[BUG] JSON#toJSONString里filters不支持同种类型的多个filter,后者会覆盖前者

Open
#3,874 1 comment 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

### 问题描述
com.alibaba.fastjson.JSON#toJSONString(java.lang.Object, com.alibaba.fastjson.serializer.SerializeFilter[], com.alibaba.fastjson.serializer.SerializerFeature...)方法里filters中若包含同种类型的多个filter,后者会覆盖前者。但该特性在fastjson1中是支持的

### 环境信息
- OS信息: [windows 11]
- JDK信息: [Oracle OpenJDK 21.0.7]
- 版本信息:[Fastjson2 2.0.60]
- 版本信息:[Fastjson1 1.2.83]

### 重现步骤
*下述操作可以重现该问题:*
```java
package josn.test;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.Arrays;

public class Test {
public static void main(String[] args) {
Address address = Address.builder().name("zhang san").mobile("123456789").city("beijing").addr("花园大街").build();
Order order = Order.builder()
.orderCode("456987987")
.orderTime("2025-10-01 01:01:01")
.userName("zhang san")
.userId("123456")
.address(address)
.build();

fastjson1(order);
System.out.println();
fastjson2(order);
}

private static void fastjson1(Order order) {
com.alibaba.fastjson.serializer.SimplePropertyPreFilter f1 =
new com.alibaba.fastjson.serializer.SimplePropertyPreFilter(Address.class);
f1.getExcludes().addAll(Arrays.asList("name", "mobile"));
com.alibaba.fastjson.serializer.SimplePropertyPreFilter f2 =
new com.alibaba.fastjson.serializer.SimplePropertyPreFilter(Order.class);
f2.getExcludes().addAll(Arrays.asList("userName", "userId"));
com.alibaba.fastjson.serializer.SimplePropertyPreFilter[] filters = {f1, f2};
System.out.println("fastjson1 过滤前:" + com.alibaba.fastjson.JSON.toJSONString(order));
System.out.println("fastjson1 过滤后:" + com.alibaba.fastjson.JSON.toJSONString(order, filters));
}

private static void fastjson2(Order order) {
com.alibaba.fastjson2.filter.SimplePropertyPreFilter f1 =
new com.alibaba.fastjson2.filter.SimplePropertyPreFilter(Address.class);
f1.getExcludes().addAll(Arrays.asList("name", "mobile"));
com.alibaba.fastjson2.filter.SimplePropertyPreFilter f2 =
new com.alibaba.fastjson2.filter.SimplePropertyPreFilter(Order.class);
f2.getExcludes().addAll(Arrays.asList("userName", "userId"));
com.alibaba.fastjson2.filter.SimplePropertyPreFilter[] filters = {f1, f2};
System.out.println("fastjson2 过滤前:" + com.alibaba.fastjson2.JSON.toJSONString(order));
System.out.println("fastjson2 过滤后:" + com.alibaba.fastjson2.JSON.toJSONString(order, filters));
}
}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
class Address {
private String name;

private String mobile;

private String city;

private String addr;

}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
class Order {
private Address address;

private String orderCode;

private String orderTime;

private String userName;

private String userId;
}
```

### 期待的正确结果
*和fastjson1保持一致,可以使用多个同种类型的filter*

### 相关日志输出
```
fastjson1 过滤前:{"address":{"addr":"花园大街","city":"beijing","mobile":"123456789","name":"zhang san"},"orderCode":"456987987","orderTime":"2025-10-01 01:01:01","userId":"123456","userName":"zhang san"}
fastjson1 过滤后:{"address":{"addr":"花园大街","city":"beijing"},"orderCode":"456987987","orderTime":"2025-10-01 01:01:01"}

fastjson2 过滤前:{"address":{"addr":"花园大街","city":"beijing","mobile":"123456789","name":"zhang san"},"orderCode":"456987987","orderTime":"2025-10-01 01:01:01","userId":"123456","userName":"zhang san"}
fastjson2 过滤后:{"address":{"addr":"花园大街","city":"beijing","mobile":"123456789","name":"zhang san"},"orderCode":"456987987","orderTime":"2025-10-01 01:01:01"}
```

Contributor guide

Open the contributing guide

Research direction

Start at JSON.toJSONString(Object, SerializeFilter[], SerializerFeature...) and reproduce the behavior with the supplied Address and Order example using two SimplePropertyPreFilter instances. Trace how filters of the same type are handled, then verify that both filters apply and the output matches the fastjson1 result.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.