解决BigDecimal序列化科学计数法前端展示问题(大坑)
1、fastJson对BigDecimal序列化和反序列化
我们看下JSON.toJSONString()的方法,我们可以看到,可以传进SerializerFeature的枚举
public static String toJSONString(Object object, SerializerFeature... features) {
return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
}
所以,我们这边传进WriteBigDecimalAsPlain枚举,就可以将数字完整返回
private static final SerializerFeature[] features = {
SerializerFeature.WriteBigDecimalAsPlain};
public static String toString(Object data) {
return JSON.toJSONString(data, features);
}
1.1 fastJson对BigDecimal转成字符串类型返回(全局处理,推荐)
public class BigDecimalConfig implements ObjectSerializer {
public static final BigDecimalConfig instance = new BigDecimalConfig();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
out.writeString(((BigDecimal) object).stripTrailingZeros().toPlainString());
}
}
public class JsonUtils {
private static final SerializerFeature[] features = {
SerializerFeature.WriteBigDecimalAsPlain };
private static final SerializeConfig serializeConfig = SerializeConfig.globalInstance;
static {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);//打开autotype功能
serializeConfig.put(BigDecimal.class, BigDecimalConfig.instance);//将BigDecimal转成字符串类型
}
/**
* 生成JSON字符串
*/
public static String toString(Object data) {
return JSON.toJSONString(data, serializeConfig, features);// 需要传入自定义的配置
}
}
1.2 fastJson对BigDecimal转成字符串类型返回(局部特定处理)
public class BigDecimalSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
if (object == null) {
serializer.out.writeNull();
return;
}
if (object instanceof BigDecimal) {
// 将BigDecimal转换为字符串形式
serializer.write(((BigDecimal) object).stripTrailingZeros().toPlainString());
} else {
// 非BigDecimal类型,使用默认序列化方式
serializer.write(object);
}
}
}
@JSONField(serializeUsing = BigDecimalSerializer.class)
private BigDecimal logisticsPrice;//物流单价
2、jackson对BigDecimal序列化和反序列化
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
gen.writeString(value.stripTrailingZeros().toPlainString());
}
}
public class BigDecimalDeserializer extends JsonDeserializer<BigDecimal> {
@Override
public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return new BigDecimal(p.getValueAsString());
}
}
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.modules(new SimpleModule().addSerializer(BigDecimal.class, new BigDecimalSerializer())
.addDeserializer(BigDecimal.class, new BigDecimalDeserializer()));
return builder;
}
}
2.1 jackson对BigDecimal转成字符串类型返回(全局处理)
自定义Jackson的JsonSerializer
实现
public class BigDecimalToStringSerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.stripTrailingZeros().toPlainString());
}
}
配置类中注册这个JsonSerializer
:
@Configuration
public class JacksonConfig {
// @Bean
// public Jackson2ObjectMapperBuilder jacksonBuilder() {
// Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
// builder.modules(new SimpleModule().addSerializer(BigDecimal.class, new BigDecimalSerializer())
// .addDeserializer(BigDecimal.class, new BigDecimalDeserializer()));
// return builder;
// }
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(BigDecimal.class, new BigDecimalToStringSerializer());
objectMapper.registerModule(module);
return objectMapper;
}
}
2.1 jackson对BigDecimal转成字符串类型返回(局部处理)
@JsonSerialize(using = BigDecimalToStringSerializer.class)
private BigDecimal rate;