首页 > 其他分享 >@JsonSerialize @JsonDeserialize @JsonFormat 三个注解的区别及一般用法

@JsonSerialize @JsonDeserialize @JsonFormat 三个注解的区别及一般用法

时间:2023-09-14 15:16:32浏览次数:29  
标签:JsonFormat JsonDeserialize LocalDateTime import 序列化 JsonSerialize 注解

三个注解区别

  • @JsonSerialize:该注解用于指定在将Java对象序列化为JSON字符串时使用的序列化器。可以将其应用于字段、方法或类级别。通过@JsonSerialize注解,可以自定义序列化过程,例如将日期格式化为特定的字符串、将枚举类型序列化为其名称而不是值等。
  • @JsonDeserialize:该注解用于指定在将JSON字符串反序列化为Java对象时使用的反序列化器。可以将其应用于字段、方法或类级别。通过@JsonDeserialize注解,可以自定义反序列化过程,例如将特定字符串转换为日期对象、将JSON中的特定字段映射到Java对象的不同属性等。
  • @JsonFormat:该注解用于指定在序列化和反序列化过程中应用的格式化规则。可以将其应用于字段、方法或类级别。通过@JsonFormat注解,可以定义日期、时间、数字等类型的格式,例如指定日期格式、指定数字的小数位数、指定枚举类型的序列化方式等。
    总结起来,@JsonSerialize用于自定义序列化过程,@JsonDeserialize用于自定义反序列化过程,@JsonFormat用于指定序列化和反序列化的格式化规则。它们可以根据需求灵活地控制对象的序列化和反序列化行为。

@JsonSerialize用法

@JsonSerialize可以在对象序列化时执行自定义的代码,我们利用这个特性可以针对对象某个属性进行特性的处理。用法例子以LocalDateTime格式化

  • 属性
@JsonSerialize(using = LocalDateTimeFormmatSerializa.class)
private LocalDateTime planInDate;
  • 序列化器
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LocalDateTimeFormmatSerializa extends JsonSerializer<LocalDateTime> {

    @Override
    public void serialize(LocalDateTime param, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (param != null) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分ss秒");
            jsonGenerator.writeString(param.format(formatter));
        }
    }
}

@JsonDeserialize用法

@JsonDeserialize可以在对象反序列化时执行自定义的代码,我们利用这个特性可以针对对象某个属性进行特性的处理。将特定格式的日期时间反序列化成LocalDateTime对象

  • 属性
@JsonDeserialize(using = LocalDateTimeFormmatDeserializa.class)
private LocalDateTime planInDate;
  • 反序列化器
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LocalDateTimeFormmatDeserializa extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        JsonNode node = p.getCodec().readTree(p);
        // 只所以是用"yyyy-MM-dd'T'HH:mm:ss"这个格式解析成对象,是因为json字符串字段格式这样的
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        LocalDateTime parse = LocalDateTime.parse(node.asText(), formatter);
        return parse;
    }
}

@JsonFormat用法

@JsonFormat当用这个注解使用在对象属性上去格式化时间时,可以简单理解为@JsonSerialize@JsonDeserialize两个注解加和,对象序列化和反序列化时都执行。
我们也可以在getter和setter方法上去使用@JsonFormat,这样可以在对象序列化和反序列化拆开使用。在getter和setter方法使用时,要成对使用,即在getter和setter方法上都加如下面例子:

@JsonFormat(pattern = "yyyy年MM月dd日HH时mm分ss秒",timezone="GMT+8")
public LocalDateTime getPlanInDate() {
    return planInDate;
}

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss",timezone="GMT+8")
public void setPlanInDate(LocalDateTime planInDate) {
    this.planInDate = planInDate;
}

对象序列化和反序列化拆开使用场景

在分布式架构,难免存在工程A中封装工程B中的接口,我们想在工程A中接收的参数对象和controller中返回的参数对象使用一个,这时就可以对象序列化和反序列化拆开使用。
比如我接收到的时间格式为'yyyy-MM-dd HH:mm:ss',但是我想返回的时间格式为'yyyy年MM月dd日HH时mm分ss秒',这样一个注解就搞定了,不用再在service中用代码单独处理

以上的用法只是奇技淫巧,大多数情况下用不到,只是在特定场景才会用到,但是多了解一些总是好的

标签:JsonFormat,JsonDeserialize,LocalDateTime,import,序列化,JsonSerialize,注解
From: https://www.cnblogs.com/shareToAll/p/17702527.html

相关文章

  • @JsonFormat 和 @DateTimeFormat
    前端传给后端:当前端传来的是键值对,用@DateTimeFormat规定接收的时间格式。当前端传来json串,后台用@RequestBody接收,用@JsonFormat规定接收的时间格式。后端传给前端:后端返回给前端的时间值,只能用@JsonFormat规定返回格式,@DateTimeFormat无法决定返回值的格式。参......
  • 使用@JsonFormat引起的时间比正常时间慢8小时解决方法
    转:使用@JsonFormat引起的时间比正常时间慢8小时解决方法 @JsonFormat,默认情况下timeZone为GMT(即标准时区),所以会造成输出少8小时。改为北京时间,方式如下:@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")      ......
  • C# Newtonsoft.Json JsonSerializerSettings配置序列化操作
    @@newtonsoft.json序列化  JsonSerializerSettings常用配置整理忽略某些属性默认值的处理空值的处理支持非公共成员日期处理(DateFormatHandling)自定义序列化的字段名称动态决定属性是否序列化枚举值的自定义格式化问题自定义类型转换全局序列化设置指定序列化时......
  • @JsonFormat和@DataFormat注解解决前后端日期格式一致性问题
    场景分析场景1:当我们从数据库中查询某篇博客文章数据时,blog表中文章发布日期blog_date这个字段,如果未经过处理,后端查询到的数据传到前端进行展示时,会得到一个不太符合我们要求的日期格式,比如:"blog_date":"2020-12-01T14:25:31.296+0000",为了解决这个问题,将后端返回给前端的日......
  • 发现流程任务的提交时间不对,@JsonFormat时间格式及时区问题
    今天遇到一个奇怪的问题,发现流程任务的提交时间不对,如下图 看代码,这个FlowTaskDto其实很多地方都用到了,比如flowRecord等,但这个myProcessNew用到就有问题,而flowRecord用到......
  • @JsonFormat和@DateTimeFormat
    JsonFormat和DateTimeFormat是两个不同的注解,它们用于不同的场景。JsonFormat是Jackson库中的注解,它用于指定Java对象在序列化或反序列化为/从JSON时的格式。D......
  • 看到项目中的DateTimeFormat和JsonFormat就头大
    刚来这家公司的时候,发现很多同事还在用这种方式写代码当时以为是偶然,刚才在群里发现还有好多人在交流应当加哪些注解,声明时区问题.当写一个东西感到麻烦的时候,......
  • @JsonSerialize
    文章目录​​使用​​​​自定义序列化类​​​​实体标注注解​​此注解用于属性或者​​getter​​​方法上,用于在序列化时嵌入开发者自定义的代码。比如将一个​​Date​......
  • @JsonInclude @JsonFormat 注解
    1.使用@JsonInclude(JsonInclude.Include.NON_NULL)注解可以返回制定格式的json数据:如果属性返回值为空,则不返回任何内容,这是由于@JsonInclude(JsonInclude.Include.N......
  • 彻底搞懂@JsonFormate和@DateTimeFormate区别和用法
    问题今天在使用@JsonFormate和@DateTimeFormate发现出现了非常多意想不到的问题;如:1)使用ajax提交json数据时,明明提交的字符串是@DateTimeFormate中规定的类型却报错400;2)没写@......