jackSon中@JsonFormat注解使用详解

x33g5p2x  于2021-12-25 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(436)

@JsonFormat

在之前做项目的时候,遇到一个烦恼的问题,从mongo里面读出来的时间类型,在实体类里面用Date接收,然后将bean传给前端的时候json中是Sun Apr 28 16:02:56 CST 2019这么显示的,但是前端要的是2019-4-28 16:02:56这样子的显示格式,而且mongo中的时间类型的时区转换到实体类里面还不一样,那就在后端处理吧,写个for循环,然后转换时区,转换格式,吭哧吭哧的处理。我恨啊,没有早知道这个注解,要不然得省我多少事儿。下面就揭开这个注解神秘的面纱。

目的

主要就是解决实体类和json之间互相转换的时候时间类型格式和时区不一致的问题,当然也可以用在枚举中和集合里面,这里不做过多阐述。

详细用法

首先我这里写个实体类

public class Param {
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

这是这个实体类json格式显示

{
  "date": "2019-04-28T08:18:21.554+0000"
}

对实体类稍微修饰了一下,加上了格式转换

public class Param {
    @JsonFormat(shape = JsonFormat.Shape.STRING , pattern = "yyyy-MM-dd HH:mm:ss")
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

显示是这样子的

{
  "date": "2019-04-28 08:24:14"
}

下一个(统一把get set方法去掉了,看着麻烦)

public class Param {
    @JsonFormat(shape = JsonFormat.Shape.NUMBER)
    private Date date;
}
{
  "date": 1556440065032
}

这里是转换时区,加上了时区UTC

public class Param {
    @JsonFormat(shape = JsonFormat.Shape.STRING , pattern = "yyyy-MM-dd HH:mm:ss", , timezone = "UTC")
    private Date date;
}
{
  "date": "2019-04-28 08:30:47"
}

我测试的时候每次返回的都是现在的时间,但是现在的时间是16点多,但是一直显示的是早上八点多,所以我看了下里面的代码,发现用了这个注解以后默认的时区就是UTC,所以用这个注解的时候要进行时区转换。

/** * {@link java.util.TimeZone} to use for serialization (if needed). * Special value of {@link #DEFAULT_TIMEZONE} * can be used to mean "just use the default", where default is specified * by the serialization context, which in turn defaults to system * default (UTC) unless explicitly set to another timezone. */
    public String timezone() default DEFAULT_TIMEZONE;

之后我获取了下咱们现在的时区

public static void main(String[] args) throws IOException {
        TimeZone aDefault = TimeZone.getDefault();
        System.out.println(aDefault.getID());
        //输出结果 Asia/Shanghai
    }

然后将时区重新设置成Asia/Shanghai

public class Param {
    @JsonFormat(shape = JsonFormat.Shape.STRING , pattern = "yyyy-MM-dd HH:mm:ss", , timezone = "Asia/Shanghai")
    private Date date;
}

现在时间就是咱们的北京时间了,16点多。

{
  "date": "2019-04-28 16:45:22"
}

经过这样子的处理以后,我就不怕实体类中时间数据类型和json之前互相转换的时候还要单独的对时间进行大量的处理了。

相关文章