【问题】                                  

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转换,无需改实体类的更多相关文章

  1. Asp.Net Core Identity 骚断腿的究极魔改实体类

    前言 默认的 Identity 实体类型在大多数时候已经基本够用,很多时候也只是稍微在 IdentityUser 类中增加一些自定义数据字段,比如头像.这次,我要向园友隆重介绍我魔改之后的 Ident ...

  2. 通过.net反射技术实现DataReader转换成Model实体类列表

     public static T ReaderToModel<T>(IDataReader dr) { try {  using (dr) {  if (dr.Read()) {  Typ ...

  3. (在线工具)JSON字符串转换成Java实体类(POJO)

    http://www.bejson.com/json2javapojo/ 付代码代码转换示例: public static FixMixedOrderResponse serialization(St ...

  4. 使用Sql语句快速将数据表转换成实体类

    开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...

  5. 关于mysql下hibernate实体类字段与数据库关键字冲突的问题

    好久没写了,都忘记博客了,趁着现在还在公司,写的东西是经过验证的,不是在家凭记忆力写的,正确率有保障,就说说最近遇到的一件事情吧. 以前一直用的oracle数据库,这次项目我负责的模块所在的系统是用的 ...

  6. 简单实体类和xml文件的相互转换

    最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简 ...

  7. 在线数据库表(sql语句)生成java实体类工具

    相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...

  8. (转)DATATABLE(DATASET)与实体类之间的互转.

    转自:http://www.cnblogs.com/zzyyll2/archive/2010/07/20/1781649.html dataset和实体类 之间的转换 //dataset转实体类  代 ...

  9. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

随机推荐

  1. 阿里云ECS服务器环境搭建(1) —— ubuntu 16.04 图形界面的安装

    阿里云ECS服务器环境搭建(1) —— ubuntu 16.04 图形界面的安装1. 背景在我们购买阿里云ECS服务器之后,默认的系统环境是很干净的,我购买的是ubuntu16.04,远程登录进入之后 ...

  2. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte

    需求:python如何实现普通用户登录服务器后切换到root用户再执行命令 解决参考: 代码: def verification_ssh(host,username,password,port,roo ...

  3. eclipse连接夜神模拟器方法

    用eclipse 进行安卓开发的时候我们会遇到安卓自带的模拟器启动时间过长,反应慢等的问题,这个时候我们就希望使用别的安卓模拟器,而我自己喜欢使用夜神模拟器.1.首先我们启动eclipse 和夜神模拟 ...

  4. openresty开发系列15--lua基础语法4表table和运算符

    openresty开发系列15--lua基础语法4表table和运算符 lua中的表table 一)table (表)Table 类型实现了一种抽象的"关联数组".即可用作数组,也 ...

  5. Python3基础 函数 参数为list可变类型时,使用append会影响到外部实参

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  6. linux硬盘分区与格式化

    linux硬盘分区与格式化: 1. 设备管理 在 Linux 中,每一个硬件设备都映射到一个系统的文件,对于硬盘.光驱等 IDE 或 SCSI 设备也不例外. Linux 把各种 IDE 设备分配了一 ...

  7. Python json序列化时default/object_hook指定函数处理

    在Python中,json.dumps函数接受参数default用于指定一个函数,该函数能够把自定义类型的对象转换成可序列化的基本类型.json.loads函数接受参数objec_thook用于指定函 ...

  8. LeetCode_299. Bulls and Cows

    299. Bulls and Cows Easy You are playing the following Bulls and Cows game with your friend: You wri ...

  9. 解决RedisDesktopManager连接不上redis问题

    linux 下安装redis很简单,在此不做赘述 发现linux上启动redis,测试redis使用正常, 但使用RedisDesktopManager却连接不上,报错如下,报错信息显示:当前使用的P ...

  10. Ubuntu与Window双系统安装的注意事项

    UBUNTU与WINDOW双系统安装的注意事项   Ubuntu与Window双系统安装的注意事项 由 匿名 (未验证) 提交于 2019-05-18 10:07:41 登录 发表评论 29 次浏览 ...