fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

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

Open clcx096 opened this issue 1 month ago • 1 comments

问题描述

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"}

clcx096 avatar Nov 17 '25 11:11 clcx096

已支持,可以等下个版本发布

jujn avatar Nov 26 '25 04:11 jujn