1.整体调用栈

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

  

  

  

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

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

  

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

  

  

  

  1. 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.加入对应类型序列化工具类

  1. import com.fasterxml.jackson.databind.DeserializationFeature;
  2. import com.fasterxml.jackson.databind.JavaType;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.fasterxml.jackson.databind.SerializationFeature;
  5. import com.fasterxml.jackson.databind.module.SimpleModule;
  6. import java.lang.reflect.Type;
  7. import java.math.BigDecimal;
  8. import java.time.LocalDate;
  9. import java.time.LocalDateTime;
  10. import java.time.LocalTime;
  11. import xxx.utils.json.deserializers.LocalDateDeserializer;
  12. import xxx.utils.json.deserializers.LocalDateTimeDeserializer;
  13. import xxx.utils.json.deserializers.LocalTimeDeserializer;
  14. import xxx.utils.json.serializers.BigDecimalSerializer;
  15. import xxx.utils.json.serializers.LocalDateSerializer;
  16. import xxx.utils.json.serializers.LocalDateTimeSerializer;
  17. import xxx.utils.json.serializers.LocalTimeSerializer;
  18.  
  19. public class JacksonHelper {
  20. private static final SimpleModule module = initModule();
  21. private static final ObjectMapper mapper;
  22. private static final ObjectMapper prettyMapper;
  23.  
  24. public JacksonHelper() {
  25. }
  26.  
  27. private static SimpleModule initModule() {
  28. 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());
  29. }
  30.  
  31. public static JavaType genJavaType(Type type) {
  32. return getMapper().getTypeFactory().constructType(type);
  33. }
  34.  
  35. public static ObjectMapper getMapper() {
  36. return mapper;
  37. }
  38.  
  39. public static ObjectMapper getPrettyMapper() {
  40. return prettyMapper;
  41. }
  42.  
  43. static {
  44. 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);
  45. prettyMapper = mapper.copy().configure(SerializationFeature.INDENT_OUTPUT, true);
  46. }
  47. }
  1. MAPPER = JacksonHelper.getMapper().registerModule((new SimpleModule(LocalDateTimeDeserializer2.class.getName())).addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer2()));
  2. MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  1. import com.fasterxml.jackson.core.JsonParser;
  2. import com.fasterxml.jackson.databind.DeserializationContext;
  3. import com.fasterxml.jackson.databind.JsonDeserializer;
  4. import com.fasterxml.jackson.databind.JsonNode;
  5. import java.io.IOException;
  6. import java.time.LocalDateTime;
  7. import java.time.format.DateTimeFormatter;
  8.  
  9. public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
  10. public LocalDateTimeDeserializer() {
  11. }
  12.  
  13. public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
  14. String dateTimeStr = ((JsonNode)jp.getCodec().readTree(jp)).asText();
  15. return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
  16. }
  17. }
  1. import com.fasterxml.jackson.core.JsonParser;
  2. import com.fasterxml.jackson.databind.DeserializationContext;
  3. import com.fasterxml.jackson.databind.JsonDeserializer;
  4. import com.fasterxml.jackson.databind.JsonNode;
  5. import java.io.IOException;
  6. import java.time.LocalDateTime;
  7. import java.time.format.DateTimeFormatter;
  8.  
  9. public class LocalDateTimeDeserializer2 extends JsonDeserializer<LocalDateTime> {
  10. public LocalDateTimeDeserializer2() {
  11. }
  12.  
  13. public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
  14. String dateTimeStr = ((JsonNode)jp.getCodec().readTree(jp)).asText();
  15. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  16. return LocalDateTime.parse(dateTimeStr, df);
  17. }
  18. }

  可见,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));

  1. import com.fasterxml.jackson.databind.deser.std.DateDeserializers;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;
  4.  
  5. public class DateDeserializer2 extends DateDeserializers.DateDeserializer{
  6. public static final DateDeserializer2 dateDeserializer = new DateDeserializer2(
  7. DateDeserializers.DateDeserializer.instance
  8. , new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss");
  9.  
  10. public DateDeserializer2() {}
  11.  
  12. public DateDeserializer2(DateDeserializers.DateDeserializer base, DateFormat df, String formatString) {
  13. super(base, df, formatString);
  14. }
  15. }

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

  

  而StdDateFormat定义的格式化如下

  

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

  

  

  

Jackson ObjectMapper readValue过程的更多相关文章

  1. com.fasterxml.jackson.databind.ObjectMapper. .readValue .convertValue

    String str="{\"student\":[{\"name\":\"leilei\",\"age\": ...

  2. Jackson ObjectMapper类使用解析

    /** * Jackson ObjectMapper类 */ //ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonPa ...

  3. spring boot定制Jackson ObjectMapper,为什么不生效

    先说结论: 项目中定制了spring 的redisTemplate,而这个template没有使用我自定义的Jackson ObjectMapper.所以不生效. 下面是详细过程: 起因是spring ...

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

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

  5. 利用ObjectMapper readValue()和泛型解决复杂json结构

    import com.dj.fss.vo.MessageListVO; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; im ...

  6. Jackson ObjectMapper类

    ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写 ...

  7. json解析之jackson ObjectMapper

    Json解析常用的有fastjson和jackson,性能上网上有不少的对比,说是fastjson比较好,今天先整理一下jackson的东西,后面再发一个fastjson的. jackson是spri ...

  8. Jackson 通过自定义注解来控制json key的格式

    Jackson 通过自定义注解来控制json key的格式 最近我这边有一个需求就是需要把Bean中的某一些特殊字段的值进行替换.而这个替换过程是需要依赖一个第三方的dubbo服务的.为了使得这个转换 ...

  9. Jackson序列化和反序列化Json数据完整示例

    Jackson序列化和反序列化Json数据 Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会 ...

随机推荐

  1. linux 链接理解

    1.软链接 只包含另外软链接的基本信息, 生成与源文件不同的节点号, 可以链接目录.不同网络的文件 2.硬链接只能链接文件,不会生成节点号,说白了就是指针,指向同个文件,所以链接的节点号与源节点号一致

  2. linux C sscanf()函数

    linux sscanf() 类似正则表达式,又不完全是正则表达式. 分割 ”/“ 或 "@" 或空格 要用 [^/] 例如: sscanf("iios/12DDWDFF ...

  3. I - Interesting Calculator (bfs使用优先队列求步数最小或者花费最小)

    题目链接:https://cn.vjudge.net/contest/245287#problem/I 代码: 使用普通的队列和优先队列相比,优先队列能更快地找到目的变量. #include<i ...

  4. mysql 案例~ 分区表

    一 简介:今天来聊聊分区表的概念和维护二分区的优点:  1.提高查询性能:只需要搜索特定分区,而非整张表,提高了查询速度.  2.节约维护时间:单个分区的数据装载,索引重建,备份,维护远远小于整张表的 ...

  5. dataTable插件锁表头和锁列的教程

    源代码下载 我的同事让我帮忙给弄个锁头锁列的插件.结果找到大名鼎鼎的jquery dataTable插件. 今天我们来介绍不常用的功能:dataTable插件锁表头和锁前两列 由于是移动前端.我们不考 ...

  6. 【vim】保存文件并退出 :w=:wq

    这两个命令实际上并不完全等价,当文件被修改时两个命令时相同的.但如果未被修改,使用 :x 不会更改文件的修改时间,而使用 :wq 会改变文件的修改时间.

  7. MySQL基于LVM快照的备份恢复(临时)

    目录1.数据库全备份2.准备LVM卷3.数据恢复到LVM卷4.基于LVM快照备份数据5.数据灾难恢复6.总结 写在前面:测试环境中已安装有mysql 5.5.36数据库,但数据目录没有存放在LVM卷, ...

  8. vue中遇到的坑!!!!!

    一 .vue安装的坑 报错时的常见问题 1.cnpm install 模块名 –save-dev(关于环境的,表现为npm run dev 启动不了)cnpm install 模块名 –save(关于 ...

  9. LoadRunner性能测试入门教程

    javaweb性能测试那些事 一:什么是javaweb性能测试: 二:javaweb性能测试基本流程 三:javaweb性能测试常用指标: 1:响应时间:2-5-8 原则 2:吞吐量 3:资源使用率 ...

  10. 如何理解深度学习中的Transposed Convolution?

    知乎上的讨论:https://www.zhihu.com/question/43609045?sort=created 不过看的云里雾里,越看越糊涂. 直到看到了这个:http://deeplearn ...