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

目录
  • @JSONField和@JsonFormat的区别
    • 一、@JSONField的常用方式
  • @JsonFormat与@DateTimeFormat用法及注意事项
    • @JsonFormat
    • @DateTimeFormat

@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异常!

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

(0)

相关推荐

  • Jackson反序列化@JsonFormat 不生效的解决方案

    今天在线上发现一个问题,在使用Jackson进行时间的反序列化时,配置的 @JsonFormat 没有生效 查看源码发现,Jackson在反序列化时间时,会判断json字段值类型,如下: 由于在我们服务里,前端传时间值到后端时采用了时间戳的方式,json值被判断为数字类型,所以Jackson在反序列化时直接简单粗暴的方式处理,将时间戳转换为Date类型: 为了能够按照正确的格式解析时间,抹去后面的时间点,精确到日,只好自定义一个时间解析器.自定义的时间解析器很好实现,网上已经有很多实例代码,只需

  • 举例讲解Java的JSON类库GSON的基本用法

    GSON这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象.Gson支持任意复杂Java对象包括没有源代码的对象. 其他的json解析库还有json-lib:Jackson:com.alibaba.fastjson 小编还是喜欢Google的Gson. 一.使用场景: java对象和json字符串的相互转换:日志输出. 例如: Logger logger = Logger.getLogger(CommonAction.class); Gson g

  • 关于fastjson的@JSONField注解的一些问题(详解)

    @JSONField 看源码它可以作用于字段和方法上. 引用网上说的, 一.作用Field @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称. 但是我在使用中,发现并不如上所说. 例如 @JSONField(name="project_id") private Long ProjectID 发现bean 转json的时候并是"project_id":xxx的形式,json转bean的时候也不会把"proj

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

    目录 @JSONField和@JsonFormat的区别 一.@JSONField的常用方式 @JsonFormat与@DateTimeFormat用法及注意事项 @JsonFormat @DateTimeFormat @JSONField和@JsonFormat的区别 @JSONField是阿里巴巴下fastjson下的,@JsonFormat是jackson下面的. 一.@JSONField的常用方式 1.1.name的用法: 实体类: package com.xiaobu.entity;

  • 关于@JsonProperty和@JSONField注解的区别及用法

    目录 @JsonProperty和@JSONField注解区别及用法 1. 目的 2. 区别 jsonField和jsonProperty注解的坑 @JSONField @JSONProperty @JsonProperty和@JSONField注解区别及用法 1. 目的 都是为了解决bean与json字段不一致问题,或者字段定义不符合前端所需要的标准 2. 区别 1.框架不同: @jsonProperty是 Jackson的包,而@jsonfield是fastjson的包 2.用法不同: (1

  • JsonFormat与@DateTimeFormat注解实例解析

    这篇文章主要介绍了JsonFormat与@DateTimeFormat注解实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景:从数据库获取时间传到前端进行展示的时候,我们有时候可能无法得到一个满意的时间格式的时间日期,在数据库中显示的是正确的时间格式,获取出来却变成了很丑的时间戳,@JsonFormat注解很好的解决了这个问题,我们通过使用@JsonFormat可以很好的解决:后台到前台时间格式保持一致的问题,其次,另一个问题是,我们

  • 使用@JsonFormat和@DateTimeFormat对Date格式化操作

    @JsonFormat和@DateTimeFormat对Date格式化 实体类 package com.pojo; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; public class User { private Long id; private String username;//用户名 private String password;//密码 private String phone;

  • springboot2中使用@JsonFormat注解不生效的解决

    目录 使用@JsonFormat注解不生效 本次使用的版本号 解决方式 @JsonFormat和@DateTimeFormat的作用 使用@JsonFormat注解不生效 百度了不少解决方式,有让用@JsonField,也有让把fastjson去掉的,也有加很多配置的,但是都没用. 本次使用的版本号 1.springboot2.2.2 ; 2.fastjson 1.1.26 3.<jackson-mapper-asl.version>1.9.10</jackson-mapper-asl.

  • java日期时间格式化@JsonFormat与@DateTimeFormat的使用

    如果要使用 @JsonFormat 这个注解的话,需要在项目中添加 jackson 相关的依赖包; 因为 @JsonFormat 注解不是 Spring 自带的注解,所以使用该注解前需要添加 jackson 相关的依赖包.当然,如果是 SpringBoot 项目就不需要自己手动添加依赖了,因为在 spring-boot-start-web 下已经包含了 jackson 相关依赖. <!-- https://mvnrepository.com/artifact/com.fasterxml.jack

  • jQuery和AngularJS的区别浅析

    最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs的话,很可能学了很久还不知道这个东西能用来干什么以及怎么使用,怎么和UI进行结合等问题,在stackoverflow上找到一篇关于这方面的文章,阅读之后颇有收获,在此基础上将它译成中文,以求抛砖引玉大家一同学习. 原问题:假如我熟悉利用jQuery去开发客户端应用,那么我怎么上手angularjs,

  • Angular中ng-bind和ng-model的区别实例详解

    ng-bind和ng-model的区别 AngularJS的数据绑定有ng-bind和ng-model,一般用于如下: <input ng-model="object.xxx"> <span ng-bind="object.xxx"></span> ng-bind是单向绑定,由作用于$scope到view层,且在HTML控件(HTML控件有:input.select.button和textarea)中不可显示. ng-model是

  • 正则表达式中test、exec、match的区别介绍及括号的用法

    test.exec.match的简单区别 1.test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert(reg.test(str)); // true 2.exec exec 查找并返回当前的匹配结果,并以数组的形式返回. var str = "1a1b1c"; var reg = new Re

  • document.write与writeln的输出内容区别说明

    document.write() //将内容写入文档,当前编辑位置为写入的内容的后一个字符 document.writeln() //将内容写入文档,并添加一个换行符,当前编辑位置为写入的内容的后一行 document.write()和document.writeln都是JavaScript向客户端写入的方法,writeln是以行方式输出的,但并不是指页面实际效果中的换行,两种方法在查看源代码时才看得出区别,除非是输出到pre或xmp元素内 测试一下: with(window.open()){

随机推荐