问题描述
- 简要描述您碰到的问题。*
环境信息
请填写以下信息:*
OS信息: win10
JDK信息: jdk11
版本信息:2.0.15
package cn.nextop.gadget.json.fastjson;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriter;
/**
* @author Baoyi Chen
* /
public class Main {
public static void main(String[] args) {
JSON.register(Long.class, new ObjectWriter<Long>() {
@Override
public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
Long value = (Long) 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(0L);
t.setValue1(new BigDecimal("0.11"));
s = JSON.toJSONString(t);
System.out.println(s);
}
public static class Test {
private Long value;
private BigDecimal value1;
public Long getValue() {
return value;
}
public void setValue(Long value) {
this.value = value;
}
public BigDecimal getValue1() {
return value1;
}
public void setValue1(BigDecimal value1) {
this.value1 = value1;
}
}
}
期待输出
{"0":"0"}
{"value":"0","value1":"0.11"}
实际输出
{"0":0}
{"value":0,"value1":0.11}
搞不懂好多版本为什么有的类型写自定义序列化器好用,有的类型不好用,自定义任何类型的序列化器应该完全覆盖默认行为。
8条答案
按热度按时间oymdgrw71#
Date/BigDecimal这些类型,自定义序列化和反序列化都容易导致性能变差,内置的性能优化实现,有些地方没考虑自定义序列化和反序列的情况。
遇到问题反馈过来,会逐步修复。
11dmarpk2#
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.16-SNAPSHOT/
问题已经修复,请用2.0.16-SNAPSHOT帮忙验证,2.0.16版本预计在10月30日前发布
icnyk63a3#
这两个内置的Feature可能就是要的,内置的性能会更好
tcomlyy64#
@wenshao
2.0.16-SNAPSHOT map里的BigDecimal还是序列化成非字符串了
期待结果
实际
qmb5sa225#
@wenshao
包括在List中的BigDecimal和Long类型,都没有按照自定义的序列化方式进行序列化
wgx48brx6#
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.16-SNAPSHOT/
问题已经修复,请用2.0.16-SNAPSHOT帮忙验证,2.0.16版本预计在10月23日前发布
wz3gfoph7#
https://github.com/alibaba/fastjson2/releases/tag/2.0.16
问题已修复,请用2.0.16版本
uemypmqf8#
@wenshao 还是有问题