SpringBoot中接收json數據及轉換日期類型


添加自定義的一個配置類.解決問題.

因為springboot默認使用的是jackjson.所以是jaxkjson的配置類:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;
import java.text.ParseException;
import java.util.Date;

/**
 * 日期字符串轉日期類型
 * jack json消息轉換器全局配置
 */
@JsonComponent
public class JsonDateDeserializer extends JsonDeserializer<Date> {
    private String[] patterns = {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-ddTHH:mm:ss.SSSZ"};

    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String dateAsString = jsonParser.getText();
        if (dateAsString == null || "".equals(dateAsString) || dateAsString.length() < 1) {
            return null;
        }
        Date parseDate = null;
        try {
            parseDate = DateUtils.parseDate(dateAsString, patterns);
        } catch (ParseException e) {
            throw new IllegalArgumentException(e.getCause());
        }

        return parseDate;
    }
}

 

 

js處理

請求格式:

$.ajax({
 type: "POST", url: "xxx", dataType: 'json',//必須指定 contentType: 'application/json',//必須指定 data: JSON.stringify(inquiryData),//如json對象為標准的json對象則此處可以直接使用否則需先轉換為json字符串 success: function(data){ ..... } });

Controller處理

//接受一個簡單的javabean
 /**
 * 對應前端data格式  * {  * javabean:{  * pro1:'value'  * ,pro2:'value'  * ,.....  * }  * } */ @RequestMapping(value = "xxx") public ResponseEntity<JavaBean> generateInquirySheet(@RequestBody JavaBean javabean) {  ..... return ResponseEntity.ok(javabean); } //接受一個復雜的javabean對象,其中包含List,javabean /**  * 對應前端data格式  * {  * javaBean1:{  * pro1:'value'  * ,pro2:'value'  * }  * ,javaBean2s:[  * {  * pro1:'value'  * ,pro2:'value'  * }  * ,{  * pro1:'value'  * ,pro2:'value'  * }  * ]  * ,.....  * } */ @RequestMapping(value = "xxx") public ResponseEntity<JavaBean> generateInquirySheet(@RequestBody JsonParam jsonParam) {  ..... return ResponseEntity.ok(javabean); } //在controller內申明一個內部類用於接收前端傳遞的參數 //注意:屬性名稱需與前端傳入的json對象中屬性名一致 class JsonParam { private JavaBean1 javaBean1; private List<JavaBean2> javaBean2s; //get,set }

日期格式化

springboot中默認接收的日期自動轉換不支持yyyy-MM-dd HH:mm:ss格式,可以通過在application.properties中指定

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

來支持此格式,但是指定之后所有前端傳遞的日期都必須為此格式才能正常轉換,否則會拋出異常

支持多種日期格式

解決方案1

手動實現一個日期類型轉換的轉換類,並注冊到springboot中

@JsonComponent public class JsonDateDeserializer extends JsonDeserializer<Date> { private String[] patterns = {"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"}; @Override public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { String dateAsString = jsonParser.getText(); Date parseDate = null; try { parseDate = DateUtils.parseDate(dateAsString, patterns); } catch (ParseException e) { throw new IllegalArgumentException(e.getCause()); } return parseDate; } }

解決方案2

在需轉換的javabean日期屬性上增加JsonFormat並指定格式,
注意:application.properties中指定spring.jackson.date-format后JsonFormat注解會失效

 @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss") private Date deadline;

其他

附一個自己寫的比較low的表單轉換json的工具方法

/* * 將指定element下所有表單元素依據前綴后綴的模式生成json對象 * 分隔符 "." 表示 對象 如 aaa.xxx * 分隔符 "[]" 表示 數組 如 aaa[]xxx * 注:. laytable 中固定右側css為 layui-table-fixed-r, * laytable固定會在頁面形成2層標簽,所以直接取會存在重復值 * */ $.fn.exSerializeByPrefix=function(){ var $form,formAsArray,name,names,prefix,suffix,value,serializeObj,arrObj,arrObjNow,arrObjLen,objMak,arrMark; objMak = '.'; arrMark ='[]'; serializeObj = {}; $form = this; formAsArray = $form.find("input, select, textarea").serializeArray(); $.each(formAsArray, function (i, obj) { name = obj.name; value = obj.value; if(name.indexOf(objMak)!=-1){ names =name.split(objMak); prefix = names[0]; suffix = names[1]; arrObjNow = serializeObj[prefix]; if( arrObjNow == null ){ arrObjNow = {}; arrObjNow[suffix] = value; serializeObj[prefix] = arrObjNow; return true; } serializeObj[prefix][suffix] = value; }else if(name.indexOf(arrMark)!=-1){ names =name.split(arrMark); prefix = names[0]; suffix = names[1]; arrObj = serializeObj[prefix]; if( arrObj == null ){ arrObj = []; arrObjNow = {}; arrObjNow[suffix] = value; arrObj.push(arrObjNow); serializeObj[prefix] = arrObj; return true; } arrObjLen = arrObj.length; arrObjNow = arrObj[arrObjLen-1]; if(arrObjNow[suffix] == null){ arrObjNow[suffix] = value; }else{ arrObjNow = {}; arrObjNow[suffix] = value; arrObj.push(arrObjNow); } }else{ serializeObj = {"message":"僅支持文本框中包含'.'和包含'[]'的名稱進行序列化,不包含則無法轉換"} } }); return serializeObj; };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM