1.整体调用栈

2.看一下调用栈的两个方法

  

  

  

  resolve 方法中通过 Iterator i$ = this._beanProperties.iterator() 遍历属性的所有子属性,缓存对应的 deserializer。观察调用栈的方法,可以发现是循环调用的。

3.比如寻找自定义的 LocalDateTime类的序列化实现类,看方法调用栈最上边的方法

  

  如果没有找到用户自定义的反序列化工具,则去找默认的标准反序列化工具

  

  

  

  deser = NumberDeserializers.find(rawType, clsName);  deser = DateDeserializers.find(rawType, clsName); 

  可以看一下 com.fasterxml.jackson.databind.deser.std.DateDeserializers 和 com.fasterxml.jackson.databind.deser.std.NumberDeserializers,遍豁然开朗。

4.加入对应类型序列化工具类

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import xxx.utils.json.deserializers.LocalDateDeserializer;
import xxx.utils.json.deserializers.LocalDateTimeDeserializer;
import xxx.utils.json.deserializers.LocalTimeDeserializer;
import xxx.utils.json.serializers.BigDecimalSerializer;
import xxx.utils.json.serializers.LocalDateSerializer;
import xxx.utils.json.serializers.LocalDateTimeSerializer;
import xxx.utils.json.serializers.LocalTimeSerializer;public class JacksonHelper {private static final SimpleModule module = initModule();private static final ObjectMapper mapper;private static final ObjectMapper prettyMapper;public JacksonHelper() {}private static SimpleModule initModule() {return (new SimpleModule()).addSerializer(BigDecimal.class, new BigDecimalSerializer()).addSerializer(LocalTime.class, new LocalTimeSerializer()).addDeserializer(LocalTime.class, new LocalTimeDeserializer()).addSerializer(LocalDate.class, new LocalDateSerializer()).addDeserializer(LocalDate.class, new LocalDateDeserializer()).addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()).addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());}public static JavaType genJavaType(Type type) {return getMapper().getTypeFactory().constructType(type);}public static ObjectMapper getMapper() {return mapper;}public static ObjectMapper getPrettyMapper() {return prettyMapper;}static {mapper = (new ObjectMapper()).registerModule(module).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true).configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);prettyMapper = mapper.copy().configure(SerializationFeature.INDENT_OUTPUT, true);}
}

MAPPER = JacksonHelper.getMapper().registerModule((new SimpleModule(LocalDateTimeDeserializer2.class.getName())).addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer2()));MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {public LocalDateTimeDeserializer() {}public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {String dateTimeStr = ((JsonNode)jp.getCodec().readTree(jp)).asText();return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);}
}

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class LocalDateTimeDeserializer2 extends JsonDeserializer<LocalDateTime> {public LocalDateTimeDeserializer2() {}public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {String dateTimeStr = ((JsonNode)jp.getCodec().readTree(jp)).asText();DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");return LocalDateTime.parse(dateTimeStr, df);}
}

  可见,ObjectMapper registerModule 最后注册的module会优先被发现。例如上边首先 第一个 Module加入了一个LocalDateTime反序列化工具类LocalDateTimeDeserializer,接着第二个Module加入了LocalDateTime反序列化工具类LocalDateTimeDeserializer2,最后得到的反序列化工具类是LocalDateTimeDeserializer2。

5.java.util.Date日期类型解析

  日期格式:yyyy-MM-dd HH:mm:ss

  第一种方法:MAPPER.setConfig(MAPPER.getDeserializationConfig().with(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")));

  第二种方法:自定义反序列化 MAPPER.registerModule((new SimpleModule(Date.class.getName())).addDeserializer(Date.class, DateDeserializer2.dateDeserializer));

import com.fasterxml.jackson.databind.deser.std.DateDeserializers;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class DateDeserializer2 extends DateDeserializers.DateDeserializer{public static final DateDeserializer2 dateDeserializer = new DateDeserializer2(DateDeserializers.DateDeserializer.instance, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss");public DateDeserializer2() {}public DateDeserializer2(DateDeserializers.DateDeserializer base, DateFormat df, String formatString) {super(base, df, formatString);}
}

  默认的Date解析通过 DateDeserializers.DateDeserializer,时间的格式化处理是调用自己的StdDateFormat类来实现日期格式化

  

  而StdDateFormat定义的格式化如下

  

  DeserializationContext中为啥可以获取StdDateFormat(objectMapper readValue 时会创建DeserializationContext, 注入DeserializationConfig【包含BaseSettings(包含DateFormat)】)

  

  

  

转载于:https://www.cnblogs.com/hujunzheng/p/8108488.html

Jackson ObjectMapper readValue过程相关推荐

  1. Jackson -- ObjectMapper

    目录 1.简介 2 Jackson的数据绑定 3 反序列化 3.1 从JSON字符串读取Java对象 3.2 从JSON文件读取Java对象 3.3 从URL获取JSON数据读取Java对象 3.4 ...

  2. Jackson ObjectMapper

    Jackson 的 ObjectMapper 可以非常轻松的帮我们实现对象和 JSON 的互转,下面是一个简单的例子. package shangbo.jackson.demo1;import jav ...

  3. Jackson(ObjectMapper)的简单使用(可转xml)

    参考文章:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html  (原文章更详细哦,且有介绍xml与java对象的互转) 参考文章作 ...

  4. Jackson - ObjectMapper

    使用Jackson转换JSON最简单的方式是通过Jackson的 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper).Jackson的 ...

  5. jackson的readValue和convertValue方法

    jackson是一个强大的json工具库,但api不够直观(至少不如fastJson),使用起来总是没有那么友好.本文介绍readValue和convertValue这两个方法的使用和区别. 在使用j ...

  6. SpringBoot教程(10) Jackson ObjectMapper使用和常用注解

    Jackson ObjectMapper使用和常用注解 一.前言 1. 引入Jackson 二.ObjectMapper 1. 创建ObjectMapper 2. 序列化 2.1 Java对象 转 J ...

  7. Spring Boot中Jackson ObjectMapper应用详解

    Spring Boot支持与三种JSON mapping库集成:Gson.Jackson和JSON-B.Jackson是首选和默认的. Jackson是spring-boot-starter-json ...

  8. jackson.ObjectMapper里enableDefaultTyping方法过期

    enableDefaultTyping过期的原因是存在漏洞[阿里云上的漏洞公告]Jackson框架enableDefaultTyping方法反序列化漏洞 漏洞名称Jackson框架enableDefa ...

  9. java 不要科学计数法_java – 设置Jackson ObjectMapper类不要使用科学记数法来表示double...

    我相信这是一个java问题.如果你调试你的程序,你的Double将始终科学地显示,所以我们想要的是强制它成为一个字符串.这可以通过多种方式在Java中实现,您可以在这里查找: 关于你关于杰克逊的具体问 ...

最新文章

  1. sgdisk 磁盘操作命令
  2. 刚刚!2021世界一流学科排名,正式发布!
  3. java rect平移_如何在Java Swing中使用鼠标平移图像
  4. 每日程序C语言20-利用递归求阶乘
  5. Redis高效性探索--线程IO模型,通信协议
  6. 使用CommandLineRunner或ApplicationRunner接口创建bean
  7. 分享无限:偷拍IBM power 720内部外部图片
  8. ashx一般处理程序
  9. 敏捷开发一千零一问系列之五:怎样让队员主动要活?
  10. Linux 超级漂亮的 Shell
  11. PowerDesigner 将 CDM 转为 Oracle SQL建表语句
  12. 计算机的发明是现代科学的奇迹之一翻译,04统考阅读新题型50篇翻译.pdf
  13. JNI/NDK入门指南之正确姿势了解JNI和NDK
  14. riser服务key/value服务介绍-基于leveldb
  15. yolo系列的head模块
  16. opp原则_完美事业OPP与NDO纲要
  17. 多台计算机直接连接打印机,多台电脑如何连接打印机?
  18. some kotlin libraries attached to this project were compiled with a newer kotlin compiler
  19. 如何避免黑客攻击?国内首个云端加密代码库来帮忙
  20. ECU BootLoader and programming implementation specification

热门文章

  1. python函数案例名片管理器_python案例:实现一个函数版的名片管理系统
  2. 数据装载指定一张表或者多张表直接装载到目标表_10
  3. -bash: lsof: 未找到命令
  4. 工作流实战_11_flowable 流程实例 跟踪流程
  5. Mybatisplus代码生成 之SpringBoot适配MYSQL和ORACLE
  6. Maven配置、使用
  7. JavaScript从入门到放弃 - ES6中的对象和类
  8. 怎么查看指定app日志_Linux系统查看系统信息和日志有哪些常用的命令
  9. galaxy s8 android pc,手机秒变PC!三星Galaxy S8桌面模式曝光
  10. mac解压rar命令_苹果mac电脑上很好用的免费压缩软件?ezip压缩软件分享