0
点赞
收藏
分享

微信扫一扫

解决elementUI或elementPlus的按钮点击后需要失去焦点才能恢复原本样式问题

解决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;

在这里插入图片描述

3、总结

举报

相关推荐

0 条评论