关于@JSONField和@JsonFormat的使用区别说明

 更新时间:2021年11月05日 16:55:00   作者:小布1994  
这篇文章主要介绍了关于@JSONField 和 @JsonFormat的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@JSONField和@JsonFormat的区别

@JSONField是阿里巴巴下fastjson下的,@JsonFormat是jackson下面的。

一、@JSONField的常用方式

1.1、name的用法:

实体类:

package com.xiaobu.entity; 
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data; 
import javax.persistence.*;
import java.io.Serializable;
 
/**
 * @author xiaobu
 * @version JDK1.8.0_171
 * @date on  2018/12/4 19:00
 * @description V1.0
 */
@Data
public class Roles implements Serializable {
    private static final long serialVersionUID = 5775171105018867238L;
 
    @JSONField(name = "role_id")
    @Column(name = "RoleId")
    private Integer RoleId;
 
    @JSONField(name = "role_desc")
    @Column(name = "RoleDesc")
    private String RoleDesc;
}

测试类:

/**
     * @author xiaobu
     * @date 2018/12/5 16:53
     * @descprition  表明  json不区分大小写都能转换
     * @version 1.0
     * bean to JSON:{"role_desc":"admin","role_id":8}
     * 需要转换的json:{"ROLE_DESC":"ADMIN","ROLE_ID":8}
     * RoleDesc:ADMIN
     */
    @Test
    public void testJSONField(){
        Roles roles = new Roles();
        roles.setRoleDesc("admin");
        roles.setRoleId(8);
        String jsonStr=JSONObject.toJSONString(roles);
        System.out.println("bean to JSON:"+jsonStr);
        //改变json的key为大写
        jsonStr = jsonStr.toUpperCase();
        System.out.println("需要转换的json:" + jsonStr);
        roles = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Roles.class);
        System.out.println("RoleDesc:"+roles.getRoleDesc());
    }

1.2 format的用法:

实体类:

 /**
     * 任务接收时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @JSONField(format = "yyyy-MM-dd")
    @Column(name="TaskAcceptTime")
    private Date TaskAcceptTime;
 
    /**
     *任务完成时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @JSONField(format = "yyyy-MM-dd")
    @Column(name="TaskCompleteTime")
    private Date TaskCompleteTime;

测试类:

@Test
    public void findByExample() {
        Task task = new Task();
        task.setTaskId("HYR08274-0804");
        Example example = new Example(Task.class);
        Example.Criteria criteria = example.createCriteria();
        if (StringUtils.isNotBlank(task.getTaskId())) {
            criteria.andLike("TaskId", "%" + task.getTaskId() + "%");
        }
        //TaskAcceptTime=Mon Aug 04 00:00:00 CST 2008,TaskCompleteTime=Fri Nov 07 00:00:00 CST 2008
        List<Task> tasks = taskMapper.selectByExample(example);
        System.out.println(tasks);
        //""taskAcceptTime":"2008-08-04","taskCompleteTime":"2008-11-07"
        String fastJsonStr = JSON.toJSONString(tasks);
        System.out.println("fastJsonStr = " + fastJsonStr);
        ObjectMapper MAPPER = new ObjectMapper();
        try {
            //""TaskAcceptTime":"2008-08-04","TaskCompleteTime":"2008-11-07 00:00:00"
            String ujosn = MAPPER.writeValueAsString(tasks);
            System.out.println("ujosn = " + ujosn);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } 
    }

@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") 必须加上时区。

@JSONField(format = "yyyy-MM-dd")

这两个的作用都是格式化日期时间。且只能作用在日期时间上。

补充:前台传后台

@DateTimeFormat(pattern="yyyy-MM-dd") 

@JsonFormat与@DateTimeFormat用法及注意事项

@JsonFormat

@JsonFormat ,使用该注解前需要添加 jackson 相关的依赖包

用于服务器传给前端json数据时对Date类型时间进行的格式化

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

pattern就表示需要转变的格式,timezone表示处在的时区(国内是东八区)

因为,jackson在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时

如果没有用@JsonFormat 对时间进行格式化,返回给前端的将是一个时间戳。如图所示。

在这里插入图片描述

使用了@JsonFormat之后,时间格式正确显示。如图所示。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

在这里插入图片描述

注意事项

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

pattern中定义的格式的大小写要注意,不要写错。。。

@DateTimeFormat

@DateTimeFormat是spring的注解,spring工程下不在需要额外引入其他依赖

由于客户端传给服务端的时间参数是字符串类型,如果直接使用java.util.Date下的Date接受的话,会报400的异常(400异常表示服务器不处理该请求,多半是传入的参数问题)

在这里插入图片描述

可以使用@DateTimeFormat将客户端发送过来的时间参数转换成想要的类型

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

pattern定义需要转换的格式(跟前面一样。大小写需要严格定义)

这样

在这里插入图片描述

服务端就可以正确接收,打印的时间参数为

Mon Apr 01 16:26:25 CST 2019

注意:@JsonFormat与@DateTimeFormat只是定义时间参数在客户端和服务端之间转换格式,控制台、Debug显示的还是java.util.Date下的Date类型形式,如果想要转换的话可以自己使用SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

一些特殊情况

如果使用pattern = "yyyy-MM-dd"接收上述客户端的参数

在这里插入图片描述

@DateTimeFormat(pattern = "yyyy-MM-dd")

这样也能正确接收到,但是会将时分秒全部置为00

Mon Apr 01 00:00:00 CST 2019

如果使用pattern = "yyyy-MM-dd HH:mm:ss"接收客户端传来的没有时分秒的参数

在这里插入图片描述

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

会报400异常!

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

相关文章

  • SpringBoot快速搭建实现三步骤解析

    SpringBoot快速搭建实现三步骤解析

    这篇文章主要介绍了SpringBoot快速搭建实现三步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java实现一致性hash算法实例代码

    java实现一致性hash算法实例代码

    这篇文章主要给大家介绍了关于java实现一致性hash算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java多线程之多种锁和阻塞队列

    Java多线程之多种锁和阻塞队列

    今天带大家学习的是Java多线程的相关知识,文章围绕着java多种锁和阻塞队列展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • SpringBoot自定义maven-plugin插件整合asm代码插桩

    SpringBoot自定义maven-plugin插件整合asm代码插桩

    本文主要介绍了SpringBoot自定义maven-plugin插件整合asm代码插桩,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java 模拟cookie登陆简单操作示例

    Java 模拟cookie登陆简单操作示例

    这篇文章主要介绍了Java 模拟cookie登陆简单操作,结合实例形式分析了Java 模拟cookie登陆的相关原理与基本实现技巧,需要的朋友可以参考下
    2020-03-03
  • Java线程池的优点及池化技术的应用

    Java线程池的优点及池化技术的应用

    这篇文章主要介绍了Java线程池的优点及池化技术的应用,Java种提高程序的执行效率有两种实现方法,一个是使用线程、另一个是使用线程池,下文我们就来具体介绍该详细内容吧,需要的小伙伴可以参考一下
    2022-05-05
  • 浅谈用java实现事件驱动机制

    浅谈用java实现事件驱动机制

    这篇文章主要介绍了浅谈用java实现事件驱动机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • java 实现文件复制和格式更改的实例

    java 实现文件复制和格式更改的实例

    java 实现文件复制和格式更改的实例,需要的朋友可以参考一下
    2013-03-03
  • @Transactional遇到try catch失效的问题

    @Transactional遇到try catch失效的问题

    这篇文章主要介绍了@Transactional遇到try catch失效的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 详解Java如何创建Annotation

    详解Java如何创建Annotation

    在本文中,我们将介绍注解的基础知识,包括注解是什么,它们如何在示例中使用,以及如何处理它们。下面和小编一起来学习吧
    2019-05-05

最新评论