• SrpingMVC通过JSON注入from数据到实体自定义(LocalDateTime,LocalDate,Boolean类型)字段的序列化、反序列化方法


    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    
    @Component
    public class JsonBooleanDeserializer extends JsonDeserializer<Boolean> {
    
        /***
         * 兼容sql92 bit数据类型 0(false) 1(true)
         * @param parser
         * @param ctxt
         * @return
         * @throws IOException
         * @throws JsonProcessingException
         */
        @Override
        public Boolean deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
            String value = parser.getText();
            if(StringUtils.isBlank(value))
            {
                return null;
            }
    
            //here we treat 1 as true, 0 false
            if(Boolean.valueOf(StringUtils.equals("1",value)))
            {
                return Boolean.TRUE;
            }
            if(Boolean.valueOf(StringUtils.equals("on",value))) //for checkbox component
            {
                return Boolean.TRUE;
            }
    
            if(Boolean.valueOf(StringUtils.equals("0",value)))
            {
                return Boolean.FALSE;
            }
    
            if(Boolean.valueOf(StringUtils.equalsIgnoreCase("true",value)))
            {
                return Boolean.TRUE;
            }
    
            if(Boolean.valueOf(StringUtils.equalsIgnoreCase("false",value)))
            {
                return Boolean.FALSE;
            }
    
            throw new RuntimeException("unsupported conversion from ["+value+"] to Boolean.");
        }
    }

    实现目的:

    将 数据库 bit类型的0,1分别转换成Boolean类型的False和true

    将短日期格式2019-01-01转换成LocalDate类的实例

    将日期时间格式的数据2019-01-01 10:10:10转换成LocalDateTime的实例

    前端数据

    <input type="radio" name="f_scjafs" value="1">接受
    <input type="radio" name="f_scjafs" checked="" value="0">取消
    
    <input style="299px;" id="f_wxdkhqzrq" name="f_wxdkhqzrq" type="text" class="input" onfocus="WdatePicker({isShowToday:true,dateFmt:'yyyy-MM-dd',readOnly:true})" value="2019-05-07">
    <input autocomplete="off" name="f_sqsj" id="f_sqsj" type="text" maxlength="100" onfocus="WdatePicker({isShowToday:true,dateFmt:'yyyy-MM-dd HH:mm:ss',readOnly:true})" value="2019-05-29 16:35:14" class="input1">

    后端结果

    前端代码

    <script type="text/javascript" src="${ctx}/js/jquery.serializejson.min.js"></script>
    <script>
     var data = {};
     data = $("#form1").serializeJSON();
     var issueProcess = [];
    
    $("#sjcljl .list").each(function(index,item) {
        var step = index+1;
        var record ={};
        record.id = replaceNull($(item).find('input[id="issueProcessId'+step+'"]').val());
        record.f_clsm = replaceNull($(item).find('textarea[id="f_clsm'+step+'"]').val());
        record.f_fk = replaceNull($(item).find('select[id="f_fk'+step+'"]').val());
        record.f_clkssj = replaceNull($(item).find('input[id="f_clkssj'+step+'"]').val());
        record.f_cljssj = replaceNull($(item).find('input[id="f_cljssj'+step+'"]').val());
        record.f_clryid = replaceNull($(item).find('input[id="f_clry1'+step+'"]').attr("f_clryid1"+step));
    
        //至少填写开始、结束时间
        if(!(isNull(record.f_clkssj)|| isNull(record.f_cljssj) ||isNull(record.f_clryid))) {
            issueProcess.push(record);
        }
    });
    
    data.issueProcess = issueProcess;
    
    
     $.ajax({
        type: "POST",
        url: "/itss/issue/save",
        dataType: 'json',
        contentType : 'application/json;charset=utf-8',
        data: JSON.stringify(data),
        success: function (resp) {
            //处理代码
        }, error: function (err) {        
            layer.alert(err.responseText, {
                offset: '200px',
            });
        }
    });
    
    
    function replaceNull(val){
        if(val==undefined || val==null || val=="" || val=='' || val=='null' || val=='-1' ||val.length<parseInt(1)){
            return null;
        }else{
            return val;
        }
    }
    </script>

    后端代码

        /***
         * 问题保存
         * @param model
         * @return
         */
        @RequestMapping(value = "/save", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
        @ResponseBody
        public ReturnParam save(@RequestBody UserIssueDto model) {
    
            ReturnParam rp = new ReturnParam();
    
            Integer id = model.getId();
    
            if (id>0) {
    
                ///....
    
            } else {
    
                ///....
            }
    
           
            return rp;
        }
        
        
        public class ReturnParam {
        
        private Object result;
        
        private String desc;
        
        private String status;
        
        private String wybs;
        
        
        public String getWybs() {
            return wybs;
        }
    
        public void setWybs(String wybs) {
            this.wybs = wybs;
        }
    
        public Object getResult() {
            return result;
        }
    
        public void setResult(Object result) {
            this.result = result;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
        
    }
    
    
    public class UserIssueDto implements Serializable
    {
        @JSONField(format = "yyyy-MM-dd HH:mm:ss")
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonSerialize(using= JsonLocalDateTimeSerializer.class)
        @JsonDeserialize(using= JsonLocalDateTimeDeserializer.class)
        private LocalDateTime f_sqsj;  //申请时间
        
        
         @JsonSerialize(using= JsonBooleanSerializer.class)
        @JsonDeserialize(using= JsonBooleanDeserializer.class)
        private Boolean f_scjafs;   //审查结案方式:0拒绝 1接受
        
        
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        @JsonSerialize(using= JsonLocalDateSerializer.class)
        @JsonDeserialize(using= JsonLocalDateDeserializer.class)
        private LocalDate f_wxdkhqzrq;// 维修单客户签字日期
        
        //...
        
    }
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    
    @Component
    public class JsonBooleanSerializer extends JsonSerializer<Boolean> {
    
        @Override
        public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throws IOException{
    
            if(null == value)
            {
                gen.writeString((String)null);
            }
            gen.writeBoolean(Boolean.TRUE.equals(value));
        }
    }
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.time.LocalDate;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    
    /***
     * 兼容jsr310的LocalDate JSON反序列化类
     */
    @Component
    public class JsonLocalDateDeserializer extends JsonDeserializer<LocalDate> {
    
        @Override
        public LocalDate deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException{
            String szLocalDate = parser.getText();
            if(StringUtils.isBlank(szLocalDate)) {
                System.err.println("invalid date supplied for conversion,ignored.");
                return null;
            }
            return LocalDate.parse(parser.getText(), DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("GMT+8")));
        }
    }
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.time.LocalDate;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    
    /***
     * 兼容jsr310的LocalDate JSON序列化类
     */
    @Component
    public class JsonLocalDateSerializer extends JsonSerializer<LocalDate> {
    
        @Override
        public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException{
    
            if(value == null)
            {
                System.err.println("invalid date supplied for conversion,ignored.");
                return;
            }
            String formattedDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("GMT+8")).format(value);
            gen.writeString(formattedDate);
        }
    }
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    
    /***
     * 兼容jsr310的LocalDateTime JSON反序列化类
     */
    @Component
    public class JsonLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    
        @Override
        public LocalDateTime deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException{
    
            String szLocalDateTime = parser.getText();
    
            if(StringUtils.isBlank(szLocalDateTime)) {
                System.err.println("invalid date supplied for conversion,ignored.");
                return null;
            }
            return LocalDateTime.parse(parser.getText(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("GMT+8")));
        }
    }
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    
    /***
     * 兼容jsr310的LocalDateTime JSON序列化类
     */
    @Component
    public class JsonLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException{
    
            if(value ==null)
            {
                System.err.println("invalid date supplied for conversion,ignored.");
                return;
            }
            String formattedDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("GMT+8")).format(value);
            gen.writeString(formattedDate);
        }
    }

    相关依赖及版本:

    commons-lang3-3.3.2.jar

    fastjson-1.2.12.jar

    jackson-datatype-jsr310-2.9.8.jar

    spring 4.2.7

    实际数据转换效果

  • 相关阅读:
    生成不带签名(BOM)的UTF8格式的XML
    矢量数据的裁剪及合并
    使用dotNET_Reactor4.7加密后的dll在VS2010中无法打包
    加密后的程序在Win8中无法运行
    修改jpg的图片大小
    shapefile中dbf的数据格式(转载)
    shapefile 输出的地理处理注意事项(转载)
    linxu下面的绝对路径和相对路径
    go中的类型转换成interface之后如何复原
    使用docker部署一个go应用
  • 原文地址:https://www.cnblogs.com/passedbylove/p/10948519.html
Copyright © 2020-2023  润新知