關(guān)于@JSONField和@JsonFormat的使用區(qū)別說明
@JSONField和@JsonFormat的區(qū)別
@JSONField是阿里巴巴下fastjson下的,@JsonFormat是jackson下面的。
一、@JSONField的常用方式
1.1、name的用法:
實(shí)體類:
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;
}
測(cè)試類:
/**
* @author xiaobu
* @date 2018/12/5 16:53
* @descprition 表明 json不區(qū)分大小寫都能轉(zhuǎn)換
* @version 1.0
* bean to JSON:{"role_desc":"admin","role_id":8}
* 需要轉(zhuǎn)換的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("需要轉(zhuǎn)換的json:" + jsonStr);
roles = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Roles.class);
System.out.println("RoleDesc:"+roles.getRoleDesc());
}
1.2 format的用法:
實(shí)體類:
/**
* 任務(wù)接收時(shí)間
*/
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
@JSONField(format = "yyyy-MM-dd")
@Column(name="TaskAcceptTime")
private Date TaskAcceptTime;
/**
*任務(wù)完成時(shí)間
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@JSONField(format = "yyyy-MM-dd")
@Column(name="TaskCompleteTime")
private Date TaskCompleteTime;
測(cè)試類:
@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") 必須加上時(shí)區(qū)。
@JSONField(format = "yyyy-MM-dd")
這兩個(gè)的作用都是格式化日期時(shí)間。且只能作用在日期時(shí)間上。
補(bǔ)充:前臺(tái)傳后臺(tái)
@DateTimeFormat(pattern="yyyy-MM-dd")
@JsonFormat與@DateTimeFormat用法及注意事項(xiàng)
@JsonFormat
@JsonFormat ,使用該注解前需要添加 jackson 相關(guān)的依賴包
用于服務(wù)器傳給前端json數(shù)據(jù)時(shí)對(duì)Date類型時(shí)間進(jìn)行的格式化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
pattern就表示需要轉(zhuǎn)變的格式,timezone表示處在的時(shí)區(qū)(國內(nèi)是東八區(qū))
因?yàn)椋琷ackson在序列化時(shí)間時(shí)是按照國際標(biāo)準(zhǔn)時(shí)間GMT進(jìn)行格式化的,而在國內(nèi)默認(rèn)時(shí)區(qū)使用的是CST時(shí)區(qū),兩者相差8小時(shí)
如果沒有用@JsonFormat 對(duì)時(shí)間進(jìn)行格式化,返回給前端的將是一個(gè)時(shí)間戳。如圖所示。

使用了@JsonFormat之后,時(shí)間格式正確顯示。如圖所示。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

注意事項(xiàng)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
pattern中定義的格式的大小寫要注意,不要寫錯(cuò)。。。
@DateTimeFormat
@DateTimeFormat是spring的注解,spring工程下不在需要額外引入其他依賴
由于客戶端傳給服務(wù)端的時(shí)間參數(shù)是字符串類型,如果直接使用java.util.Date下的Date接受的話,會(huì)報(bào)400的異常(400異常表示服務(wù)器不處理該請(qǐng)求,多半是傳入的參數(shù)問題)

可以使用@DateTimeFormat將客戶端發(fā)送過來的時(shí)間參數(shù)轉(zhuǎn)換成想要的類型
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
pattern定義需要轉(zhuǎn)換的格式(跟前面一樣。大小寫需要嚴(yán)格定義)
這樣

服務(wù)端就可以正確接收,打印的時(shí)間參數(shù)為
Mon Apr 01 16:26:25 CST 2019
注意:@JsonFormat與@DateTimeFormat只是定義時(shí)間參數(shù)在客戶端和服務(wù)端之間轉(zhuǎn)換格式,控制臺(tái)、Debug顯示的還是java.util.Date下的Date類型形式,如果想要轉(zhuǎn)換的話可以自己使用SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
一些特殊情況
如果使用pattern = "yyyy-MM-dd"接收上述客戶端的參數(shù)

@DateTimeFormat(pattern = "yyyy-MM-dd")
這樣也能正確接收到,但是會(huì)將時(shí)分秒全部置為00
Mon Apr 01 00:00:00 CST 2019
如果使用pattern = "yyyy-MM-dd HH:mm:ss"接收客戶端傳來的沒有時(shí)分秒的參數(shù)

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
會(huì)報(bào)400異常!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot快速搭建實(shí)現(xiàn)三步驟解析
這篇文章主要介紹了SpringBoot快速搭建實(shí)現(xiàn)三步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
java實(shí)現(xiàn)一致性hash算法實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)一致性hash算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot自定義maven-plugin插件整合asm代碼插樁
本文主要介紹了SpringBoot自定義maven-plugin插件整合asm代碼插樁,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Java線程池的優(yōu)點(diǎn)及池化技術(shù)的應(yīng)用
這篇文章主要介紹了Java線程池的優(yōu)點(diǎn)及池化技術(shù)的應(yīng)用,Java種提高程序的執(zhí)行效率有兩種實(shí)現(xiàn)方法,一個(gè)是使用線程、另一個(gè)是使用線程池,下文我們就來具體介紹該詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下2022-05-05
淺談?dòng)胘ava實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制
這篇文章主要介紹了淺談?dòng)胘ava實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
java 實(shí)現(xiàn)文件復(fù)制和格式更改的實(shí)例
java 實(shí)現(xiàn)文件復(fù)制和格式更改的實(shí)例,需要的朋友可以參考一下2013-03-03
@Transactional遇到try catch失效的問題
這篇文章主要介紹了@Transactional遇到try catch失效的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

