alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.79k stars 495 forks source link

[BUG]JSON.parseObject设置NameFilter参数无效 #3141

Open LeasonX opened 2 weeks ago

LeasonX commented 2 weeks ago

问题描述

JSON.parseObject设置NameFilter参数无效

环境信息

请填写以下信息:

重现步骤

自定义NameFilter实现时,会触发

在JSON.toJSONString中使用NameFilter处理字段名是可以更换json 字段名,但是反序列化时使用JSON.parseObject设置NameFilter参数无效,代码如下:

public class BaseConverter {
    @Data
    static class Ikun {
        private Long seq;
    }

    public static void main(String[] args) {
        NameFilter nf = (object, name, value) -> {
            if ("seq".equals(name)) {
                return "id";
            }
            return name;
        };
        System.out.println(JSON.parseObject("{\"id\": 2}", Ikun.class, nf).seq);
    }
}

期待的正确结果

至少有一个输出为 2

相关日志输出

null null

附加信息

看这个issue后续已经解决了包装内部PropertyNamingStrategy的Filter产生的bug,但是自定义的还未解决

LeasonX commented 2 weeks ago

刚刚测试了,发现只有在Ikun类构造函数带有seq成员变量时,会正确输出,之前issue的解决并没有覆盖全case

public class BaseConverter {
    @Data
    static class Ikun {
        private Long seq;
        private String x;

        public Ikun(Long seq) {
            this.seq = seq;
        }
    }

    public static void main(String[] args) {
        NameFilter nf = (object, name, value) -> {
            if ("seq".equals(name)) {
                return "id";
            }
            return name;
        };
        System.out.println(JSON.parseObject("{\"id\": 2}", Ikun.class, nf).seq);
    }
}

结果: 2 符合预期


public class BaseConverter {
    @Data
    static class Ikun {
        private Long seq;
        private String x;

        public Ikun(String x) {
            this.x = x;
        }
    }

    public static void main(String[] args) {
        NameFilter nf = (object, name, value) -> {
            if ("seq".equals(name)) {
                return "id";
            }
            return name;
        };
        System.out.println(JSON.parseObject("{\"id\": 2}", Ikun.class, nf).seq);
    }
}

结果: null 不符合预期

wenshao commented 2 weeks ago

目前NameFilter只能作用于toJSONString

LeasonX commented 2 weeks ago

目前NameFilter只能作用于toJSONString

感觉跟这个issue是一个问题啊,但是那个case标注了fixed(而且只解决了一半)

LeasonX commented 2 weeks ago

目前NameFilter只能作用于toJSONString

那有什么方法可以实现反序列化的自定义字段名映射(不用注解)