首页 > 其他分享 >jackson时间格式解决方案

jackson时间格式解决方案

时间:2023-03-31 14:35:10浏览次数:40  
标签:return 解决方案 dd yyyy 格式 date jackson 序列化 public

jackson时间格式解决方案

你遇到下面这个异常吗??

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2021-01-23 22:02:17": not a valid representation (error: Failed to parse Date value '2021-01-23 22:02:17': Cannot parse date "2021-01-23 22:02:17": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSX', parsing fails (leniency? null))

这个异常是jackson在处理json字符串 to Object类型的时候,json字符串中包含类似"yyyy-MM-dd HH:mm:ss""yyyy-MM-dd HH:mm"格式的时间字符串,这种格式是属于国内常用时间格式,jackson默认是不认识的。当你的字符串中一旦出现这种,jackson会直接给你报错。
好在jackson可以让用户能灵活的配置。那么接下来,我们就去探索解决方案。

看起来最简单的解决方案

我们遇到的格式问题,jackson开发者必然也能想到,所以它为我们提供了@JsonFormat注解,我们可以根据需要在属性上设置格式的转化,使用如下:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date date;
  • pattern指定序列化格式,timezone指定时区;
  • 这种方式满足我们解决异常的需求,但是如果有太多的日期类需要转化,这真是让人头大,不过别怕,且看下文处理。

最省心的解决方案

JSON序列化和反序列化工具类

/**
 * json工具类
 *
 * @author huaqi@liu
 * @since 2023-03-30 16:51:42
 */
public class JSON {

    private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    static {
        // 设置全局的TimeZone
        OBJECT_MAPPER.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        // 全局处理时间 ,SimpleDateFormat的构造函数参数中是序列化需要滴!
        OBJECT_MAPPER.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"){
			// 这个方法是反序列化需要滴!
            @Override
            public Date parse(String source) throws ParseException {
                return DateUtils.str2Data(source);
            }
        });
    }
    /**
     * 字符串转化成对象
     * @param json
     * @param <T>
     * @return
     */
    public static <T> T parser(String json, Class<T> clazz) throws JsonProcessingException {
        return OBJECT_MAPPER.readValue(json, clazz);
    }
    /**
     * 对象转化成字符串
     * @param object
     * @return
     */
    public static String stringify(Object object) throws JsonProcessingException {
        return OBJECT_MAPPER.writeValueAsString(object);
    }
}

时间工具类

/**
 * 时间格式类
 *
 * @author huaqi@liu
 * @since 2023-03-30 16:51:42
 */
public class DateUtils {
    private static List<String> fmtList = new ArrayList<String>() {{
        add("yyyy-MM-dd HH:mm:ss");
        add("yyyy-MM-dd HH:mm");
        add("yyyy-MM-dd HH");
        add("yyyy-MM-dd");
    }};

    /***
     * 转换字符串为日期date
     *
     * 自动匹配转化,支持fmtList中的几种格式
     * @param dateStr
     * @param fmtIndex
     * @return
     */
    public static Date str2Data(String dateStr, int... fmtIndex) {
        int index = 0;
        if (fmtIndex != null && fmtIndex.length > 0) {
            index = fmtIndex[0];
        }
        if (index > fmtList.size() - 1) {
            return null;
        }
        SimpleDateFormat format = new SimpleDateFormat(fmtList.get(index));
        try {
            Date date = format.parse(dateStr);
            return date;
        } catch (ParseException e1) {
            return str2Data(dateStr, ++index);
        }
    }

    /***
     * date格式化字符串
     * @param date
     * @param fmt
     * @return
     */
    public static String date2str(Date date, String fmt) {
        SimpleDateFormat format = new SimpleDateFormat(fmt);
        return format.format(date);
    }
}

注意:属性上的注解配置优先级高于全局配置,可以根据自身需求进行搭配使用。

其他解决方案

网上搜索序列化问题,很多文章告诉你实现jackson提供的序列化和反序列化接口,代码如下:

/**
 * 自定义反序列化
 *
 * @author huaqi@liu
 * @since 2023-03-30 16:51:42
 */
public class CustomDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        return DateUtils.str2Data(jsonParser.getText());
    }
}

/**
 * 自定义序列化
 *
 * @author huaqi@liu
 * @since 2023-03-30 16:51:42
 */
public class CustomDateSerializer extends JsonSerializer<Date> {

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(DateUtils.date2str(date, "yyyy-MM-dd HH:mm:ss"));
    }
}

使用方式,只需要在需要处理的时间属性上增加序列化和反序列化注解,如下代码:

/**
 * 自定义序列化
 */
@JsonDeserialize(using = CustomDateDeserializer.class)
@JsonSerialize(using = CustomDateSerializer.class)
private Date goHomeTime;

这种实现其实和@JsonFormat处理方式差不多,都需要在每个字段上设置。

标签:return,解决方案,dd,yyyy,格式,date,jackson,序列化,public
From: https://www.cnblogs.com/little-monster-lhq/p/17276162.html

相关文章

  • 格式
         ......
  • 关于Bitmap 导致的OOM 解决方案
    相机越来越好,相片也越来越大,而手机应用程序所分配的内存有限, 所以在读相片的时候,如果代码写得不好,经常导致OOM.信息如下:基本上要注意几个地方:1bitmap如果不用了,回收掉voidonDestroy(){super.onDestroy();if(bmp1!=null){bmp1.recyc......
  • 利用Jackson序列化实现数据脱敏
    作者:京东物流张晓旭1.背景在项目中有些敏感信息不能直接展示,比如客户手机号、身份证、车牌号等信息,展示时均需要进行数据脱敏,防止泄露客户隐私。脱敏即是对数据的部分信息用脱敏符号(*)处理。2.目标在服务端返回数据时,利用Jackson序列化完成数据脱敏,达到对敏感信息脱敏展示。降低重......
  • 微信小程序使用 wxs 对模板数据格式化展示
    在小程序页面展示时,对时间、金额进行格式化处理。但是每次在js文件中处理,并setData感觉无比麻烦。是否可以直接在wxml模板文件中进行处理。正好发现了微信小程序wxs,完全满足需求。微信小程序wxs使用场景WXS(WeiXinScript)是微信创造的一套脚本语言,虽然看起来很JS异常......
  • NSDateFormatter设定日期格式
    部分日期格式的总结:NSDateFormatter*dateFormatter=[[[NSDateFormatteralloc]init]autorelease];[dateFormattersetAMSymbol:@"AM"];[dateFormattersetPMSymbol:@"PM"];[dateFormattersetDateFormat:@"dd/MM/yyyyhh:mmaaa"];NSDate*date=[......
  • WebUploader大文件上传解决方案支持分片断点上传
    ​ 前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有......
  • javascript大文件上传解决方案支持分片断点上传
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • CAD格式的数据如何导入和卫星图叠加
    在城市规划、道路管线、林业、农业、地质和环境监测等各行各业的国民经济建设中,一般都会需要将CAD与卫星影像无偏移叠加配准。因为影像地图具有影像内容、线划要素、数学......
  • csharp大文件上传解决方案支持分片断点上传
    ​ 4GB以上超大文件上传和断点续传服务器的实现随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。但是在......
  • MySQL导入数据库1118错误解决方案[ERR] 1118 - Row size too large (> 8126). Changing
    MySQL导入数据库1118错误解决方案[ERR]1118-Rowsizetoolarge(>8126).ChangingsomecolumnstoTEXTorBLOB编辑sql文件,在开头设置一下innodb_strict_mode为0SE......