@JsonSerialize不起作用的解决方案

目录
  • @JsonSerialize不起作用
    • 在项目中 当字段实体类为Long类型时
    • 但是这里有个小坑
  • @JsonSerialize正确使用
    • 1. 写一个负责转换的类
    • 2. 在实体类上需要装换的字段上加上注解

@JsonSerialize不起作用

在项目中 当字段实体类为Long类型时

如果Long值超过前端js显示的长度范围时会导致前端回显错误

此时我们想到的解决方案是将Long值返回给前端时转为String,

但是我们又不想变更字段的类型,当然我们也不想额外添加新的字段。

这个时候我们可以用@JsonSerialize,在Json序列化的时候把Long自动转为String,

但是这里有个小坑

被转换的字段必须是包装类类型,否则会转换失败。

@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;    //转化成功
@JsonSerialize(using = ToStringSerializer.class)
private long parentId;    //转化失败

@JsonSerialize正确使用

实际开发中,我们一定遇到过这样的问题:前端显示和后台存储数据单位不统一,而且各有各自的理由,统一不了,那就只能由后端转换。

每次返回给前端时再转换一遍,返回给前端的json数据,在后端里定义的往往是一个对象,如何做到优雅的转换呢?只需两步操作:

1. 写一个负责转换的类

里面写好规则

 public class MySerializerUtils extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        String statusStr = "";
         switch (status) {
             case 0:
                 statusStr = "新建状态";
                 break;
             case 1:
                statusStr = "就绪状态";
                 break;
             case 2:
                 statusStr = "运行状态";
                 break;
             case 3:
                 statusStr = "阻塞和唤醒线程";
                 break;
             case 4:
                statusStr = " 死亡状态";
               break;
             default:
                 statusStr = "状态信息不符合";
         }
         jsonGenerator.writeString(statusStr);
     }
 }

2. 在实体类上需要装换的字段上加上注解

/**
 * 多线程生命周期状态值
 */
@JsonSerialize(using = MySerializerUtils.class)
private int status;

注:@JsonSerialize注解,主要应用于数据转换,该注解作用在该属性的getter()方法上。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Shell脚本自动更新hosts实现免翻墙访问google

    上次给大家发了一个python更新google hosts的脚本,今天看到有人发出了一句用shell来获取google hosts的脚本,我就拿来稍微简单加工了下,下面给大家shell版的更新google hosts的脚本. 脚本内容: 复制代码 代码如下: cat google_update.sh #!/bin/bash data=`date +%y%m%d%H%M` curl http://www.360kb.com/kb/2_122.html 2>/dev/null | sed -n '/

  • SpringMVC用JsonSerialize日期转换方法

    最近在用SpringMvc做Http接口时,对方在调用我接口时发现Date格式的默认转化为long,因此在前端页面看到的是一串数字. 我们可以自定义代码的转换器,返回数据到前台的时候就可以按照我们的需要返回格式化后的字符串类型数据. package com.cnpc.mall.web.utils; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.cod

  • springboot @JsonSerialize的使用讲解

    目录 @JsonSerialize的使用讲解 1.写一个类继承JsonSerializer 抽象类 2.然后在传输的实体类中的属性上 3.附加:还有一个比较好用的注解 4.附加:之前附件3的注解,还是有个问题 @JsonSerialize 相关使用(jsonUtil) 基础注解使用 框架层面的使用 附:jsonUtil完整代码 @JsonSerialize的使用讲解 解决前端显示和后台存储数据单位不一致的问题. 在返回对象时,进行自定义数据格式转换. 1.写一个类继承JsonSerializer

  • @JsonSerialize不起作用的解决方案

    目录 @JsonSerialize不起作用 在项目中 当字段实体类为Long类型时 但是这里有个小坑 @JsonSerialize正确使用 1. 写一个负责转换的类 2. 在实体类上需要装换的字段上加上注解 @JsonSerialize不起作用 在项目中 当字段实体类为Long类型时 如果Long值超过前端js显示的长度范围时会导致前端回显错误 此时我们想到的解决方案是将Long值返回给前端时转为String, 但是我们又不想变更字段的类型,当然我们也不想额外添加新的字段. 这个时候我们可以用@

  • jquery append 动态添加的元素事件on 不起作用的解决方案

    用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delete). 具体不多说了,请看下面的代码吧. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <h

  • spring boot ${}占位符不起作用的解决方案

    spring boot ${}占位符不起作用 问题: 在 pom.xml 文件里定义好属性标签,然后在 properties或者xml 中使用${key}引用,打包之后就会自动替换掉.但是在使用 spring boot 后发现,@可以替换,但是${-}替换不了. 分析: spring boot设置了默认值. 解决: 在pom文件中自己定义delimiters springboot配置文件占位符 1.随机数 #idea配置文件默认是utf-8 person.name=r a n d o m . u

  • vue样式叠层z-index不起作用的解决方案

    目录 z-index不起作用 z-index失效的原因 vue element 弹框样式叠层问题 z-index不起作用 问题:当点击出现element弹框时,与当前的页面出现叠层问题(使用样式z-index无果),导致弹框页面无法输入. 问题效果图如下: 这里的两个下拉框和echarts图表与弹框修改密码出现叠层问题. 解决思路: 本人一开始在层级上寻在了半天,未能解决问题(采用样式z-index无果),后来发现是上个开发兄弟在两个下拉框和echarts图表均使用到了样式 position:

  • JS中append字符串包含onclick无效传递参数失败的解决方案

    append后面跟要添加的参数 <i class="fa fa-share pointer" aria-hidden="true" title="分享" onclick="share('${img.imgId}','${img.imgTitle}','${imgCover}','http://www.liuda.tv/selectedImg?imgId=${img.imgId}')"></i> 上面这段

  • Vue.config.productionTip = false 不起作用的问题及解决

    最近跟着网上的视频学习Vue,照着写了一段最简单的代码,原本以为不会有问题,可偏偏就出问题了.引入开发版的vue.js <script src="js/vue.js"></script> 会出现如下的提示 为了控制台不出现上面的提示信息,所以设置了Vue.config.productionTip = false Vue.config.productionTip = false 十多天前我开始学的时候,这么做是有效的,提示信息不出现,可奇怪的是,我今天再去运行这段

  • 11g Oracle导出表不导出数据默认为空表的解决方法

    11g oracle导出表时会默认不导出数据为空 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment. 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 查看: SQL>show parameter deferred_

  • 解决Linux系统中python matplotlib画图的中文显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • 分析一个MySQL的异常查询的案例

    问题 用户工单疑问:相同的语句,只是最后的limit行数不同.奇怪的是,limit 10 的性能比limit 100的语句还慢约10倍. 隐藏用户表信息,语句及结果如下 SELECT f1 , SUM(`f2`) `CNT` FROM T WHERE f1 IS NOT NULL AND f3 = '2014-05-12' GROUP BY f1 ORDER BY `CNT` DESC LIMIT 10; 执行时间3 min 3.65 sec SELECT f1 , SUM(`f2`) `CNT

  • vue 请求后台数据的实例代码

    需要引用vue-resource 安装请参考https://github.com/pagekit/vue-resource官方文档 在入口函数中加入 import VueResource from 'vue-resource' Vue.use(VueResource); 在package.json文件中加入 "dependencies": { "vue": "^2.2.6", "vue-resource":"^1.2

随机推荐