Jackson之LocalDateTime转换,无需改实体类
【问题】
Demo:
LocalDateTime dt = LocalDateTime.now();
ObjectMapper mapper = new ObjectMapper();
try {
String json = mapper.writeValueAsString(dt);
System.out.println(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Jackson默认序列化会将LocalDateTime序列化成:
{"dayOfMonth":15,"dayOfWeek":"SUNDAY","dayOfYear":258,"hour":14,"minute":6,"month":"SEPTEMBER","monthValue":9,"nano":359000000,"second":55,"year":2019,"chronology":{"id":"ISO","calendarType":"iso8601"}}
并且该字符串反序列化成LocalDateTime会报错:
Cannot construct instance of `java.time.LocalDateTime`
Demo:
String json = "{\"dayOfMonth\":15,\"dayOfWeek\":\"SUNDAY\",\"dayOfYear\":258,\"hour\":14,\"minute\":2,\"month\":\"SEPTEMBER\",\"monthValue\":9,\"nano\":71000000,\"second\":46,\"year\":2019,\"chronology\":{\"id\":\"ISO\",\"calendarType\":\"iso8601\"}}";
ObjectMapper mapper = new ObjectMapper();
try {
LocalDateTime dt = mapper.readValue(json, LocalDateTime.class);
System.out.println(dt);
} catch (IOException e) {
e.printStackTrace();
}
就算加了:
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.registerModule(new JavaTimeModule());
也会报如下错误:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Expected array or string.
Demo:
String json = "{\"dayOfMonth\":15,\"dayOfWeek\":\"SUNDAY\",\"dayOfYear\":258,\"hour\":14,\"minute\":2,\"month\":\"SEPTEMBER\",\"monthValue\":9,\"nano\":71000000,\"second\":46,\"year\":2019,\"chronology\":{\"id\":\"ISO\",\"calendarType\":\"iso8601\"}}";
ObjectMapper mapper = new ObjectMapper();
try {
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.registerModule(new JavaTimeModule());
LocalDateTime dt = mapper.readValue(json, LocalDateTime.class);
System.out.println(dt);
} catch (IOException e) {
e.printStackTrace();
}
【解决方案】
思路:
改变jackson内部序列化和反序列化LocalDateTime的方式,序列化时转换为时间戳,反序列化时将时间戳转换为LocalDateTime即可。
代码:
创建两个类,分别继承JsonSerializer和JsonDeserializer
//时间序列化时变为时间戳
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeNumber(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli());
}
}
//时间戳反序列化时间
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
Long timestamp = jsonParser.getLongValue();
return LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8));
}
}
使用方法(序列化添加如下3行红色代码)
LocalDateTime dt = LocalDateTime.now();
ObjectMapper mapper = new ObjectMapper();
try {
JavaTimeModule timeModule = new JavaTimeModule();
timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
mapper.registerModule(timeModule);
String json = mapper.writeValueAsString(dt);
System.out.println(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
* 经过此方式序列化得到的结果为:"1568528927273"
使用方法(反序列化添加如下3行红色代码)
String json = "1568528927273";
ObjectMapper mapper = new ObjectMapper();
try {
JavaTimeModule timeModule = new JavaTimeModule();
timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
mapper.registerModule(timeModule);
LocalDateTime dt = mapper.readValue(json, LocalDateTime.class);
System.out.println(dt);
} catch (IOException e) {
e.printStackTrace();
}
以上就是本文所有内容~~~ 欢迎交流,,分享~~~
Jackson之LocalDateTime转换,无需改实体类的更多相关文章
- Asp.Net Core Identity 骚断腿的究极魔改实体类
前言 默认的 Identity 实体类型在大多数时候已经基本够用,很多时候也只是稍微在 IdentityUser 类中增加一些自定义数据字段,比如头像.这次,我要向园友隆重介绍我魔改之后的 Ident ...
- 通过.net反射技术实现DataReader转换成Model实体类列表
public static T ReaderToModel<T>(IDataReader dr) { try { using (dr) { if (dr.Read()) { Typ ...
- (在线工具)JSON字符串转换成Java实体类(POJO)
http://www.bejson.com/json2javapojo/ 付代码代码转换示例: public static FixMixedOrderResponse serialization(St ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- 关于mysql下hibernate实体类字段与数据库关键字冲突的问题
好久没写了,都忘记博客了,趁着现在还在公司,写的东西是经过验证的,不是在家凭记忆力写的,正确率有保障,就说说最近遇到的一件事情吧. 以前一直用的oracle数据库,这次项目我负责的模块所在的系统是用的 ...
- 简单实体类和xml文件的相互转换
最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简 ...
- 在线数据库表(sql语句)生成java实体类工具
相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...
- (转)DATATABLE(DATASET)与实体类之间的互转.
转自:http://www.cnblogs.com/zzyyll2/archive/2010/07/20/1781649.html dataset和实体类 之间的转换 //dataset转实体类 代 ...
- 利用JAXB实现java实体类和xml互相转换
1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...
随机推荐
- javaweb--Rest访问(RestTemplate)
Rest访问(RestTemplate)在实际的项目中,往往需要发送一个Get/Post请求到其他的系统(Rest API),比如向人员管理部门请求,然后解析返回信息获取该用户的基本信息等.JDK传统 ...
- Socket通信(1):搭建开发环境
一. 准备工具 1. mac环境下的VMware Fusion, 下载地址:https://www.newasp.net/soft/462096.html 2. ubuntu 14.04 LTS, 不 ...
- 2019年逾期率上升_24家头部P2P平台最新运营数据解读:8家近一年逾期率走势曝光
python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...
- MySQL TiDB PingCAP mydumper
MySQL备份之[mydumper 学习] - jyzhou - 博客园https://www.cnblogs.com/zhoujinyi/p/3423641.html maxbube/mydumpe ...
- [转载] Ubuntu上Firefox字体太小--高分屏背锅
版权声明:本文为CSDN博主「mythinker2」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/myth ...
- Spark累加器(Accumulator)
一.累加器简介 在Spark中如果想在Task计算的时候统计某些事件的数量,使用filter/reduce也可以,但是使用累加器是一种更方便的方式,累加器一个比较经典的应用场景是用来在Spark St ...
- gfs下载文件较大,可以分区域分变量下载
一.下载 所有字段的GFS预报(大致有325个字段),1度的文件有1G多,0.5度的3.5G左右. 若每天下载0.6.12.18四个发布点的数据,那是很费时费力的.而且经常会被IDS/IPS设备 ...
- jsoup爬取某网站安全数据
jsoup爬取某网站安全数据 package com.vfsd.net; import java.io.IOException; import java.sql.SQLException; impor ...
- Spring cloud微服务安全实战-6-3JWT改造之网关和服务改造
网关上认证去做哪些改造 在网关上用jwt去解析用户信息,而不再发送校验令牌的请求了. 之前的时候网关上实际上写了很多的代码 包括认证,发check_token去把token请求,换成用户信息. 这俩是 ...
- scons 简单入门
scons 简单入门 摘自:https://www.jianshu.com/p/e4bd3ab9e5d6 0.2042019.01.20 12:58:44字数 1201阅读 3021 简单入门 hel ...