springboot @JsonSerialize 的使用

解决前端显示和后台存储数据单位不一致的问题。

在返回对象时,进行自定义数据格式转换。

1.写一个类继承JsonSerializer 抽象类, 实现其serialize()方法,然后在方法中写入转换规则即可

举例是把Date时间戳从 毫秒 转换成 秒  为单位

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Date;

/**
 * @program: sell
 * @description: 时间转换Json序列化工具
 * @author: Liang Shan
 * @create: 2019-08-06 16:58
 **/
public class Date2LongSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}

 

2.然后在传输的实体类中的属性上打上@JsonSerialize注解即可

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ls.sell.enums.OrderStatusEnum;
import com.ls.sell.enums.PayStatusEnum;
import com.ls.sell.util.serializer.Date2LongSerializer;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @program: sell
 * @description: 订单主表
 * @author: Liang Shan
 * @create: 2019-07-24 09:44
 **/
@Entity
@Data
@DynamicUpdate
public class OrderMaster {

    @Id
    private String orderId;

    private String buyerName;

    private String buyerPhone;

    private String buyerAddress;

    private String buyerOpenid;

    private BigDecimal orderAmount;

    /** 订单状态,默认为新下单. */
    private Integer orderStatus = OrderStatusEnum.NEW.getCode();

    /** 支付状态,默认为0未支付. */
    private Integer payStatus = PayStatusEnum.WAIT.getCode();

    @JsonSerialize(using = Date2LongSerializer.class)
    private Date createTime;

    @JsonSerialize(using = Date2LongSerializer.class)
    private Date updateTime;
}

3.附加:还有一个比较好用的注解,如果返回对象中变量存在null,可以使用@JsonInclude(JsonInclude.Include.NON_NULL)注解来忽略为null的变量,这样前端比较好处理

package com.ls.sell.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ls.sell.entity.OrderDetail;
import com.ls.sell.entity.OrderMaster;
import lombok.Data;

import java.util.List;

/**
 * @program: sell
 * @description: 数据传输对象,传给前端时忽略值为null的属性
 * @author: Liang Shan
 * @create: 2019-07-25 16:05
 **/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO extends OrderMaster {
    private List<OrderDetail> orderDetailList;
}
使用注解之前的返回值:

使用注解之后:

还是比较好用的。

4.附加:之前附件3的注解,还是有个问题,如果一个一个实体类配置的话,未免太过麻烦,所以可以在配置文件中直接配置,yml配置文件如下:

### Spring Boot 中使用 `@JsonSerializer` 和自定义序列化器 在Spring Boot应用程序中处理JSON数据时,Jackson库提供了强大的功能来定制对象到JSON以及JSON到对象的转换过程。为了实现特定类型的字段按照特殊需求进行序列化,可以创建并应用自定义的序列化器。 对于提到的两个注解: - **`@JsonSerialize`**: 这个不是内置于Spring框架而是来自Jackson的数据绑定包(com.fasterxml.jackson.databind.annotation.JsonSerialize)。用于指定某个属性或方法返回值应该通过哪一个类来进行序列化操作。 - **`JsonSerializerInside`**: 此名称看起来像是一个假设性的例子或者是误打的文字串,在标准Java/Jackson/Spring生态里并没有这样一个预定义好的注解存在;如果这是项目内部开发的一个自定义注解,则需查看具体项目的文档说明其用途和用法[^1]。 下面展示了一个简单的案例,其中包含如何定义自己的序列化逻辑,并将其应用于实体类中的日期时间字段上: ```java import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CustomLocalDateTimeSerializer extends StdSerializer<LocalDateTime> { private static final long serialVersionUID = 1L; protected CustomLocalDateTimeSerializer() { super(LocalDateTime.class); } @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDate = value.format(formatter); gen.writeString(formattedDate); } } ``` 接着可以在POJO中这样配置该自定义序列化器: ```java import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class Event { private Long id; @JsonSerialize(using = CustomLocalDateTimeSerializer.class) private LocalDateTime eventTime; // getters and setters... } ``` 上述代码片段展示了怎样编写一个针对`LocalDateTime`类型的自定义序列化程序,并且指定了当遇到此类成员变量时应采用何种方式生成对应的JSON字符串表示形式[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值