fastjson2
fastjson2 copied to clipboard
[BUG] JSON#toJSONString里filters不支持同种类型的多个filter,后者会覆盖前者
问题描述
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]
重现步骤
下述操作可以重现该问题:
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"}
已支持,可以等下个版本发布