@JsonSerialize(using = ToStringSerializer.class)和@JsonSerialize注解的使用方法

这篇具有很好参考价值的文章主要介绍了@JsonSerialize(using = ToStringSerializer.class)和@JsonSerialize注解的使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. fastjson的ToStringSerializer注解:

java中long数据能表示的范围比js中number大,在跟前端交互时,这样也就意味着部分数值在js中存不下(变成不准确的值)。

解决办法可以这样:

使用fastjson的ToStringSerializer注解,让系统序列化时,保留相关精度。

/**
 * 记录属性的主键
 */
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
场景: id为long,传到后台就变了值 。
测试一下,这个要是只有几位数的情况下,其实都不需要这个注解,大于某个值,19位数的时候就会出问题,导致精度丢失;
解决办法:在实体类上面添加这个注解就可以了。
原因:使用fastjson的ToStringSerializer注解,让系统序列化时,保留相关精度。
ToStringSerializer是一个类,还有一个与它类似的是
@JsonSerialize(using = LongToStringUtil.class) 和前端交互时,值比number数值更大,会导致精度缺失,使用JsonSerialize注解,可以帮助我们解决该问题。
在using = LongToStringUtil.class,可以使用我们自定义的类,来将我们传入的值转换为String类型,来传入到前端,可以解决精度问题,定义的LongToStringUtil类需要继承自JsonSerializer类。
  1. @JsonSerialize注解自定义class的使用方法:

关于这个注解的方法,可以自己定义class,作为using的值来使用。

/** 
* 订单创建时间 
*/
@JsonSerialize(using = DateToLongSerializer.class)
private Date createTime;

这个的意义就是当转成json时,把时间转成秒的格式。

public class DateToLongSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, 
                SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}
  1. @JsonSerialize注解处理BigDecimal自定义方法:

  • BigDecimal 类型的字段,指定保留两位小数(或者更多自定义):

创建一个注解类,统一帮助我们实现对BigDecimal此类型字段数值的封装操作

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;
 
public class BigDecimal2Serializer extends JsonSerializer<BigDecimal> {
    // private DecimalFormat df = new DecimalFormat("0.00"); // 为空时也保留2位
    public BigDecimal2Serializer() {
    }
    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider 
serializers) throws IOException {
        if (value != null) {
            BigDecimal number = value.setScale(2, BigDecimal.ROUND_HALF_UP);
            gen.writeNumber(number);
            // gen.writeNumber(df.format(number));    // 转换
        } else {
            gen.writeNumber(value);
        }
 
    }
}

创建完注解类后,具体什么字段需要保留两位有效数字,就在对应的字段上加上此注解

@JsonSerialize(using = BigDecimal2Serializer.class)
private BigDecimal price;

最后返回的值就是保留两位有效数字的

  • 相关方法

构造器描述

BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。

方法

add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。

4舍5入

BigDecimal.setScale() 方法用于格式化小数点
setScale(1) 表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN) 直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP) 进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP) 四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN) 四舍五入,2.35变成2.3,如果是5则向下舍
setScaler(1,BigDecimal.ROUND_CEILING) 接近正无穷大的舍入
setScaler(1,BigDecimal.ROUND_FLOOR) 接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
setScaler(1,BigDecimal.ROUND_HALF_EVEN) 向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

更多

  • Long数据类型防止精度丢失,添加注解:@JsonFormat(shape = Shape.STRING)

  • BigDecimal数据类型的限制注解使用:@DecimalMin、@DecimalMax、@Digits


@ApiModelProperty(value = "报账总金额")
@DecimalMin(value = "0", inclusive = false, message = "报账总金额必须大于0")
@Digits(integer = 10, fraction = 2, message = "报账总金额 最大长度:10,允许精度:2")
private BigDecimal financeMoney;

@ApiModelProperty(value = "供应商", required = true)
@NotBlank(message = "供应商不能为空")
@Len(min = 1, max = 500)
private String provider;

@ApiModelProperty(value = "价格")
@NotNull(message = "价格不能为空")
@Min(value = 100, message = "价格不能低于100")
@Max(value = 5000, message = "价格不能超过5000")
@Size(min = 10, max = 50, message = "数量必须不低于10不超过50")
private Integer price;

@Valid和@Validated区别,参考链接

@JsonSerialize(using = ToStringSerializer.class)和@JsonSerialize注解的使用方法

类型转换:

开发中会出现一些对返回数据进行转换的要求,如果直接去修改返回对象代码显得很臃肿,如何由于的进行转换。可以在对象转换成Json的时候进行替换,编写@JsonSerialize转换类:

public class MySerializer 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;
            default:
                statusStr = "状态获取失败";
        }
        jsonGenerator.writeString(statusStr);
    }
}

在需要转换的字段上面加@JsonSerialize注解:

/**
 * 文字型状态值
 */
@JsonSerialize(using = MySerializerUtils.class)
private int status;

// String类型字段
@JsonSerialize(using = StringToArraySerializer.class)
@JsonProperty(value = "pserial")
private String pSerial;



import cn.hutool.json.JSONException;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.NoArgsConstructor;

import java.io.IOException;

/**
 * 字符串数组转数组
 * '["0","1","2"]' -> ["0","1","2"]
 * @author csp
 * @date 2022/05/8 11:05
 */
@NoArgsConstructor
public class StringToArraySerializer extends JsonSerializer<String> {

    @Override
    public void serialize(String jsonStr, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (StringUtils.isNotBlank(jsonStr)) {
            try {
                JSONArray jsonArray = JSONArray.parseArray(jsonStr);
                String[] strArray = new String[jsonArray.size()];
                for (int i = 0; i < jsonArray.size(); i++) {
                    strArray[i]=jsonArray.getString(i);
                }
                jsonGenerator.writeArray(strArray, 0, strArray.length);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

【实现方式】
方式一:通过使用工具类,在请求进入前,或响应前对参数进行处理,然后进行封装,此方法略

方式二:使用 @JsonDeserialize 和 @JsonSerialize 注解对在序列化和反序列化时对参数进行处理
【Pojo 类】

@JsonDeserialize
是在反序列化时,所以就是对参数进行封装,故到的是 setXxxx() 方法,所以需要将注解添加到对应的 set 方法上,若使用了 Lombok 需要自己定义相应的 set 方法。
 需要使用 using 属性指定处理参数的类,该类需要继承 JsonDeserializer 类,并重写 deserialize()。

@JsonSerialize
是在序列化时,所以需要获取数据,那么需要使用到 getXxxx() 方法,故需要将注解添加到对应的 get 方法上,若使用了 Lombok 需要自己定义相应的 get 方法。
        需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。


如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。文章来源地址https://www.toymoban.com/news/detail-445011.html

到了这里,关于@JsonSerialize(using = ToStringSerializer.class)和@JsonSerialize注解的使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[使用静态方法和类方法]

    分类目录:《系统学习Python》总目录 相关文章: · 静态方法(staticmethod)和类方法(classmethod):基础知识 · 静态方法(staticmethod)和类方法(classmethod):使用静态方法和类方法的原因 · 静态方法(staticmethod)和类方法(classmethod):初识Python中的静态方法 · 静态方法(

    2024年01月25日
    浏览(50)
  • Spring Cache的介绍以及使用方法、常用注解

    Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能. Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。 CacheManager是Spring提供的各种缓存技术抽象接口。 针对不同的缓存

    2024年02月16日
    浏览(37)
  • SpringBoot 增强Controller方法,@ControllerAdvice注解的使用

    参考资料 @ControllerAdvice 用法 SpringBoot使用@ControllerAdvice注解 @ControllerAdvice ,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller进行增强处理。 配合 @ExceptionHandler 注解,进行全局异常处理。 配合 @InitBinder 注解,用来设置 WebDataBinder ,用于自动绑定前台请求参数到

    2024年02月08日
    浏览(43)
  • 使用axios请求@DeleteMapping注解的接口的方法

    前端使用delete方法访问接口,后端使用@DeleteMapping注解,方法内使用@PathVariable接参,注意注解中的: /{id} 的用法 前端接口: axios.delete(‘http://127.0.0.1:8080/api/deleteUserById/’+id) .then(response = { // 处理成功响应 console.log(‘删除成功’, response); }) .catch(error = { // 处理错误响应 consol

    2024年02月15日
    浏览(37)
  • Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目

    @ 目录 Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目 每博一文案 1. web.xml 的缺点分析 2. @WebServlet 注解 2.1 @WebServlet注解当中常用的一些属性的说明 3. 使用模板方法设计模式优化oa项目 4. 总结: 5. 最后: 分析 oa 项目中的 web.xml 文件 具体的可以移步至:

    2023年04月11日
    浏览(38)
  • 【Spring框架全系列】方法注解@Bean的使用

    📬📬哈喽,大家好,我是小浪。上篇博客我们介绍了五大类注解的使用方法,以及如何解决Spring使用五大类注解生成bean-Name的问题;那么,谈到如何更简单的读取和存储对象,这里我们还需要介绍另外一个\\\"方法注解@Bean\\\"的使用,快来一起学习叭!🛳🛳 📲目录 一、如何使

    2024年02月04日
    浏览(43)
  • 如何将重复方法封装为Aop切面并结合注解使用

    首先要导入依赖 编写注解 编写Aop 方法上添加注解   然后测试就发现添加代码的方法都可以防止重复提交了!!

    2024年02月02日
    浏览(47)
  • IDEA使用lombok实体类加上@Data注解后无法找到get和set方法

    IDEA没有安装lombok插件 重启完成后测试是否能正常调用get和set方法,如果不行如下图启用注释处理

    2024年02月16日
    浏览(42)
  • SpringBoot 使用【AOP 切面+注解】实现在请求调用 Controller 方法前修改请求参数和在结果返回之前修改返回结果

    在项目中需要实现 在请求调用 Controller 方法前修改请求参数和在结果返回之前修改返回结果 。 我们可以使用 AOP 切面+注解的形式实现。这样我们就可以在不修改原始代码的情况下,通过切面类在方法调用前后插入额外的逻辑。 自定义注解 @PreProcess 自定义注解 @PreProcess 用于

    2024年03月20日
    浏览(44)
  • 【pip升级】使用pip安装时出现要You are using pip version 22.0.4; however, version 23.0.1 is available报错的解决方法

            使用pip安装工具包时出现如下报错,提示要升级pip:         切换路径到以上的D盘路径,切换方法为:在文件资源管理器中找到该路径,然后在路径上直接输入cmd命令,按回车即可弹出该路径下的控制台页面。         然后尝试输入以下命令升级pip:  

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包