alibaba / fastjson2

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

[BUG]FieldBased后 不会调用public setter 进行赋值 #1950

Open wangjing112 opened 1 year ago

wangjing112 commented 1 year ago

问题描述

当设置JSONReader.Feature.FieldBased 不会调用public的setter进行复制了. 即使没有合适private的成员,也不调用合适的setter.

环境信息

请填写以下信息:

重现步骤

如何操作可以重现该问题:


import org.junit.Test;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;

public class JSONFieldBasedTest {
    @Test
    public void test() {

        String json = "{\"id\":101,\"data\":\"1\"}";

        DATA data = JSON.parseObject(json,DATA.class,JSONReader.Feature.FieldBased);

        System.out.println(data.mdata);
    }

    public static enum EnumType{
        A,B;
        public static EnumType parse(String str) {
            return "1".equals(str)?A:B;
        }
    }

    public static class DATA{
        int id;
        EnumType mdata;

        public String getData() {
            return mdata==EnumType.A?"1":"2";
        }
        public void setData(String val) {
            System.out.println("in parse type");
            mdata = EnumType.parse(val);
        }
    }
}
wenshao commented 1 year ago

设计就是这样的,不是BUG

wangjing112 commented 1 year ago

那设置了FieldBased 还有其他途径对字段做反序列化的处理吗? 还是说一旦设置FieldBased,只能解析到属性上?如果是这样的话,感觉不如以前的设计.

wenshao commented 1 year ago

如果没有设置FieldBased,public field和public的getter/setter会被解析。fastjson 1.x也是这样的

wangjing112 commented 1 year ago

如果没有设置FieldBased,public field和public的getter/setter会被解析。fastjson 1.x也是这样的

1.x 不是这样的,在1.x里面如果有setter会优先给setter处理.

wangjing112 commented 1 year ago

说一下应用场景,项目中有若干配置数据,配置数据读入private字段,不希望被直接访问. 有配置如下: [{"id":123,"args":"23,123,23,4213,123"},...] 配置类需要将args解析成一个int[]数组.因为在具体使用中是采用int[]进行处理的. 所以在1.x的时候,配置类如下


public class Cfg{
private int id;
private int[] args;

public void setArgs(String str){
    args = prace(str);
}
`

如果这种方式无效了的话,现在只能采用先用一个string存放数据,读入后在将其转换成int[].
但带来的影响就是,如果这个配置数据数量很多的话,那么每个对象至少多了4个字节,造成不必要的内存消耗.
wangjing112 commented 1 year ago

捞一下这个问题,目前这个问题是唯一阻止项目升级到fastjson2的最后一块石头了.

wenshao commented 1 year ago

收到需求,我要想下这个怎么实现。只有一个类这样么?还是有多个类?

wangjing112 commented 1 year ago

收到需求,我要想下这个怎么实现。只有一个类这样么?还是有多个类?

很多类,因为我们应用有大量的配置文件需要处理,配置文件中存在对各种数据的预处理,需要进行各种转换变成更好的数据结构给应用层使用.

wangjing112 commented 1 year ago

因为配置数据是由一个数据系统生成,而且一份配置是给诸多应用使用的,所以无法去修改输出的json文件格式. 我们在用fastjson1的时候,就采用了setter的方式灵活的进行了配置数据的处理.希望2能继续支持这个功能. 感谢!

wangjing112 commented 11 months ago

再捞一下这个问题.

wangjing112 commented 7 months ago

这还有救嘛?