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;
};