• 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;
    };
  • 相关阅读:
    npm发包流程
    K8S 多集群管理命令行工具: KubeCM
    为什么打印出来的单词少一横,如H、A、e等等
    Redission锁的设计原理和应用
    ELK学习笔记
    题解 noip2018模拟测试赛(三十五)
    题解 noip2018模拟测试赛(三十三)
    题解 noip2018模拟测试赛(三十二)
    题解 noip2018模拟测试赛(三十一)
    题解 【BZOJ3309】DZY Loves Math
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/12869260.html
Copyright © 2020-2023  润新知