问题描述
当业务的classloader与fastjson2的不一致时,序列化结果不符合预期:
包装类型,值不为null,为对应基础类型默认值,如Integer num=0,在序列化后缺失
环境信息
- OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.0.63]
重现步骤
1、序列化的数据结构:
class UserModel {
private String name;
private Integer age;
private int ageOri;
private Double score;
}
该类通过自定义的ClassLoader加载,同时设置值为
name: 张三
age: 0
ageOri: 0
score: 95.5
2、使用JSON.toJSONString(userModel, JSONWriter.Feature.NotWriteDefaultValue);
3、序列化结果为 {"name":"张三","score":95.5},其中Integer age缺失
4、使用2.0.60版本,序列化结果为 {"age":0,"ageOri":0,"name":"张三","score":95.5},ageOri仍存在,NotWriteDefaultValue特性不生效
// 自定义ClassLoader
CustomClassLoader classLoader = new CustomClassLoader();
String userModelClassName = "UserModel";
Class<?> userModelClass = classLoader.loadClass(userModelClassName);
// 实例化对象
Constructor<?> constructor = userModelClass.getConstructor(String.class, Integer.class, Double.class,int.class);
Object userModel = constructor.newInstance("张三", 0, 95.5,0);
// 序列化
String json = JSON.toJSONString(userModel, JSONWriter.Feature.NotWriteDefaultValue);
期待的正确结果
对您期望发生的结果进行清晰简洁的描述。
使用NotWriteDefaultValue特性,基本类型默认值,包装类型为null时才能舍弃
相关日志输出
请复制并粘贴任何相关的日志输出。
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。
问题描述
当业务的classloader与fastjson2的不一致时,序列化结果不符合预期:
包装类型,值不为null,为对应基础类型默认值,如Integer num=0,在序列化后缺失
环境信息
重现步骤
1、序列化的数据结构:
class UserModel {
private String name;
private Integer age;
private int ageOri;
private Double score;
}
该类通过自定义的ClassLoader加载,同时设置值为
name: 张三
age: 0
ageOri: 0
score: 95.5
2、使用JSON.toJSONString(userModel, JSONWriter.Feature.NotWriteDefaultValue);
3、序列化结果为 {"name":"张三","score":95.5},其中Integer age缺失
4、使用2.0.60版本,序列化结果为 {"age":0,"ageOri":0,"name":"张三","score":95.5},ageOri仍存在,NotWriteDefaultValue特性不生效
期待的正确结果
对您期望发生的结果进行清晰简洁的描述。
使用NotWriteDefaultValue特性,基本类型默认值,包装类型为null时才能舍弃
相关日志输出
请复制并粘贴任何相关的日志输出。
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。