服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 关于@JSONField和@JsonFormat的使用区别说明

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

2022-07-09 09:43小布1994 Java教程

这篇文章主要介绍了关于@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 对时间进行格式化,返回给前端的将是一个时间戳。如图所示。

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

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

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

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

注意事项

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

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

@DateTimeFormat

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

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

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

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

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

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

这样

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

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

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"接收上述客户端的参数

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

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

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

Mon Apr 01 00:00:00 CST 2019

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

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

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

会报400异常!

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

原文链接:https://blog.csdn.net/tanhongwei1994/article/details/84851363

延伸 · 阅读

精彩推荐