fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] Boolean 字段private修饰 使用valueFilter 会有问题

Open mystox opened this issue 1 year ago • 1 comments

问题描述

实体中字段为Boolean时 想将对应空值转成“”时报错, 其中active 修饰为public的时候正常, 请问这种情况是设计如此还是存在bug? 补充一下 似乎 Integer也有这个问题,自定义的ObjectWriter 不生效

@Data class User { public String name; public Integer age; private Boolean active;

public User(String name, Integer age, Boolean active) {
    this.name = name;
    this.age = age;
    this.active = active;
}

}

public class Fastjson2ValueFilterExample { public static void main(String[] args) { User user = new User("Alice", null, null);

    // 定义一个 ValueFilter,将 null 值修改为默认值
    ValueFilter filter = (object, name, value) -> {
        if (value == null) {
            return "N/A"; // 如果字段值为 null,改为 "N/A"
        }
        return value;
    };

    // 使用 ValueFilter 序列化
    String jsonString = JSON.toJSONString(user, filter, JSONWriter.Feature.WriteNulls);
    System.out.println(jsonString);
    // 输出:{"name":"Alice","age":"N/A","active":"N/A"}
}

}

提示报错 Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean at com.alibaba.fastjson2.writer.ObjectWriterImplBoolean.write(ObjectWriterImplBoolean.java:25) at com.alibaba.fastjson2.writer.ObjectWriterAdapter.writeWithFilter(ObjectWriterAdapter.java:577) at com.alibaba.fastjson2.writer.ObjectWriter3.write(ObjectWriter3.java:63) at com.alibaba.fastjson2.JSON.toJSONString(JSON.java:3083) at com.itime.debtdefuse.assets.util.Fastjson2ValueFilterExample.main(Fastjson2ValueFilterExample.java:34)

似乎Integer字段也有这个问题

参考代码:

import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.writer.ObjectWriter;

import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map;

/**

  • @author Baoyi Chen */ public class Main { public static void main(String[] args) { JSON.register(Integer.class, new ObjectWriter<Integer>() { @Override public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { Integer value = (Integer) object; if (value == null) jsonWriter.writeNull(); else jsonWriter.writeString(Long.toString(value)); } });

     JSON.register(BigDecimal.class, new ObjectWriter<BigDecimal>() {
         @Override
         public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
             BigDecimal value = (BigDecimal) object;
             if (value == null) jsonWriter.writeNull(); else jsonWriter.writeString(value.toPlainString());
         }
     });
    
     Map<String, Long> map = new HashMap<>();
     map.put("0", 0L);
     String s = JSON.toJSONString(map);
     System.out.println(s);
    
     Test t = new Test();
     t.setValue(0);
     t.setValue1(new BigDecimal("0.11"));
     s = JSON.toJSONString(t);
     System.out.println(s);
    

    }

    public static class Test { private Integer value; private BigDecimal value1;

     public Integer getValue() {
         return value;
     }
    
     public BigDecimal getValue1() {
         return value1;
     }
    
     public void setValue(Integer value) {
         this.value = value;
     }
    
     public void setValue1(BigDecimal value1) {
         this.value1 = value1;
     }
    

    } }

mystox avatar Oct 09 '24 03:10 mystox

@mystox 看代码走向,跟非public类有关。推荐使用 XCodeMap 走读源码,追踪对象字段的生命周期,快速定位有效分支。 https://xcodemap.tech/

xcodemap avatar Oct 14 '24 02:10 xcodemap

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.54-SNAPSHOT/ 问题已修复,请帮忙用2.0.54-SNAPSHOT快照版本验证,2.0.54正式版本预计在月底发布

wenshao avatar Nov 02 '24 21:11 wenshao

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.54-SNAPSHOT/ 问题已修复,请帮忙用2.0.54-SNAPSHOT快照版本验证,2.0.54正式版本预计在月底发布

验证符合期望,辛苦

mystox avatar Nov 04 '24 09:11 mystox

https://github.com/alibaba/fastjson2/releases/tag/2.0.54 问题已修复,请用新版本

wenshao avatar Jan 12 '25 08:01 wenshao