伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

jackson使用@JsonSerialize格式化BigDecimal处置.00不显示问题

一、 问题

最近开发中使用BigDecimal这个数据类型 返回json数据时呈现了点问题:
  1. # 1.前端第一次保管的时候 穿过来的数据格式
  2. 240.00
  3. 240.77
  4. # 2. mysql数据库存储的数据格式(数据库字段已经设置了保留小数点后两位)
  5. 240
  6. 240.77
  7. # 3. java程序中查看从数据库中查询的回来的数据格式:
  8. 240.00
  9. 240.77
  10. # 4. 返回前端的json字符串里的数据格式:
  11. 240
  12. 240.77
  13. # 4. 前端想要的json字符串里的数据格式:
  14. 240.00
  15. 240.77
复制代码
由上面的一系列分析可知:要想处置这个根源在于返回json数据的时候需要将数据格式化。
二、处置方案:使用@JsonSerialize输出数据保留两位小数

步骤1.创建一个BigDecimal格式化工具
  1. import com.fasterxml.jackson.core.JsonGenerator;
  2. import com.fasterxml.jackson.databind.JsonSerializer;
  3. import com.fasterxml.jackson.databind.SerializerProvider;
  4. import java.io.IOException;
  5. import java.math.BigDecimal;
  6. public class BigDecimalSerialize extends JsonSerializer<BigDecimal> {
  7.   @Override
  8.   public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
  9.     if (value != null && !"".equals(value)) {
  10.       gen.writeString(value.setScale(2, BigDecimal.ROUND_HALF_DOWN) + "");
  11.     } else {
  12.       gen.writeString(value + "");
  13.     }
  14.   }
  15. }
复制代码
步骤二:在返回的实体类对应的属性上加上注解:
  1. @JsonSerialize(using = BigDecimalSerialize.class)
  2. private BigDecimal totalCost;
复制代码
总结

这个方案可以统一处置json的Date日期类型,String类型。double类型。。。等等的序列化格式问题
延伸:@JsonSerialize正确使用
实际开发中,我们一定遇到过这样的问题:前端显示和后台存储数据单位不统一,而且各有各自的理由,统一不了,那就只能由后端转换。每次返回给前端时再转换一遍,返回给前端的json数据,在后端里定义的往往是一个对象,如何做到优雅的转换呢?只需两步操作:1. 写一个负责转换的类,里面写好规则
  1. public class MySerializerUtils extends JsonSerializer<Integer> {
  2.   @Override
  3.   public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
  4.     String statusStr = "";
  5.      switch (status) {
  6.        case 0:
  7.          statusStr = "新建状态";
  8.          break;
  9.        case 1:
  10.         statusStr = "就绪状态";
  11.          break;
  12.        case 2:
  13.          statusStr = "运行状态";
  14.          break;
  15.        case 3:
  16.          statusStr = "阻塞和唤醒线程";
  17.          break;
  18.        case 4:
  19.         statusStr = " 死亡状态";
  20.         break;
  21.        default:
  22.          statusStr = "状态信息不符合";
  23.      }
  24.      jsonGenerator.writeString(statusStr);
  25.    }
  26. }
复制代码
2. 在实体类上需要装换的字段上加上注解
  1. /**
  2. * 多线程生命周期状态值
  3. */
  4. @JsonSerialize(using = MySerializerUtils.class)
  5. private int status;
复制代码
注:@JsonSerialize注解,主要应用于数据转换,该注解作用在该属性的getter()方法上。

到此这篇关于jackson使用@JsonSerialize格式化BigDecimal处置.00不显示问题的文章就介绍到这了,更多相关jackson @JsonSerialize格式化BigDecimal 内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

杜冷丁
注册会员
主题 26
回复 19
粉丝 0
|网站地图
快速回复 返回顶部 返回列表