上一篇:关于Redis的问题探讨(一):为何存放集合偏向于转String后存放而非直接存

在上篇中发现了一个问题,明明存的是一个对象的集合,为什么通过range方法返回的却是LinkeHashMap

于是通过debug看看源码,了解执行流程,找一下原因

这是笔者通过debug画出的大致流程:

注意看8中,mapObject方法,这里就是返回LinkeHashMap的原因,这里重点解析一下mapObject方法:

protected Object mapObject(JsonParser p, DeserializationContext ctxt) throws IOException {
       // 获取字段名称,也就是key
String key1 = p.getText();
       // 执行前该token是FIELD_NAME,也就是字段名称
       // 然后执行nextToken()后,变为了VALUE_STRING,也就是String类型的字段值
       // 但是如果值不为String类型,那就会在后面又执行一次nextToken,变为VALUE_NUMBER_INT,也就是整数型字段值
p.nextToken();
Object value1 = this.deserialize(p, ctxt);
String key2 = p.nextFieldName();
if (key2 == null) {
LinkedHashMap<String, Object> result = new LinkedHashMap(2);
result.put(key1, value1);
return result;
} else {
          // 解释在上面
p.nextToken();
          // 获取value值
Object value2 = this.deserialize(p, ctxt);
String key = p.nextFieldName();
LinkedHashMap result;
if (key == null) {
result = new LinkedHashMap(4);
result.put(key1, value1);
result.put(key2, value2);
return result;
} else {
result = new LinkedHashMap();
result.put(key1, value1);
result.put(key2, value2); do {
p.nextToken();
result.put(key, this.deserialize(p, ctxt));
} while((key = p.nextFieldName()) != null); return result;
}
}
}

首先就是这个p也就是JsonParser对象,他是通过JsonFactory的createParser方法创建的,其作用是解析Json字符串,因此在执行之前mapObject之前就已经将value解析并存入JsonParser中了。

JsonParser解释参考:https://blog.csdn.net/LBWNB_Java/article/details/120003565

然后执行流程可以参考注释

以上就是为何返回LinkeHashMap的原因,那么如何解决呢

这里就要用到ObjectMapper,在range方法的流程图中也看到其实也使用了他

通过ObjectMapper的convertValue方法将LinkeHashMap转为目标对象:

@Test
public void testRange() {
String key = "right_push_all_01";
List<LinkedHashMap<String, Object>> linkedHashMapList = redisService.lRange(key, 0, -1);
ObjectMapper objectMapper = new ObjectMapper();
List<ThisIsDTO> thisIsDTOList = objectMapper.convertValue(linkedHashMapList, new TypeReference<List<ThisIsDTO>>() {
});
for (ThisIsDTO thisIsDTO : thisIsDTOList) {
System.out.println(thisIsDTO.getAge());
}
}

注意:因为是集合存放,所以一定要new TypeReference<List<ThisIsDTO>>来定义转换的类型

如果只是单个对象,可以直接 objectMapper.convertValue(linkedHashMap, ThisIsDTO.class)

运行测试:

可以发现转换成功了

关于Redis的问题探讨(二):Range方法返回的对象是LinkeHashMap以及转换办法的更多相关文章

  1. Python/dotNET Redis服务连接客户端调用SET方法的同时获取Redis服务器返回的内容

    在用Python或dotNET redis客户端连接redis服务器的时候,当你调用客户端的SET方法后同时还想得到其返回的字符串,那么需要处理一下. 1. Redis Python redis客户端 ...

  2. Java 使用Redis缓存工具的图文详细方法

    开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. (1)Java的安装配置可以参考我们的 Java ...

  3. Redis学习笔记(二)-key相关命令【转载】

    转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...

  4. Go 语言入门(二)方法和接口

    写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(二 ...

  5. Redis详解(二)——AOF

    Redis详解(二)--AOF 前言 RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失).对于数据完整性要求很严格的需求 ...

  6. Redis性能篇(二)CPU核和NUMA架构的影响

    Redis被广泛使用的一个很重要的原因是它的高性能.因此我们必要要重视所有可能影响Redis性能的因素.机制以及应对方案.影响Redis性能的五大方面的潜在因素,分别是: Redis内部的阻塞式操作 ...

  7. mysql 远程连接数据库的二种方法

    http://blog.csdn.net/freecodetor/article/details/5799550 一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5 ...

  8. IIS7.5使用web.config设置伪静态的二种方法

    转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...

  9. Redis实战之征服 Redis + Jedis + Spring (二)

    不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...

随机推荐

  1. 怎样用JavaScript和HTML5 Canvas绘制图表

    原文:https://code.tutsplus.com/zh-...原作:John Negoita翻译:Stypstive 在这篇教程中,我将展示用JavaScript和canvas作为手段,在饼状 ...

  2. MapReduce在集群执行任务时报错:Initialization of all the collectors failed. Error in last collector was:java.lang.ClassCastException

    报错信息详细: Error: java.io.IOException: Initialization of all the collectors failed. Error in last colle ...

  3. VMware workstation16 许可证

    ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 若资金允许,请购买正 ...

  4. 微信小程序HTTP接口请求封装

    1.方法封装(新建文件夹util,工具文件,在文件夹下创建request.js文件,用于对方法封装)request.js: var app = getApp(); //项目URL相同部分,减轻代码量, ...

  5. 【编译原理】自底向上分析方法——LR文法分析方法的总结

    LR(0).SLR(1).LR(1).LALR(1) de 若干方面的区别 目录 推导过程 分析能力 本质区别 文法对比 可以适当利用物理意义对二义性文法进行冲突处理 推导过程 LR(0)的基础上才有 ...

  6. Java对象和多态

    Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...

  7. docker容器编排原来这么丝滑~

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概念介绍: Docker Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Docker ...

  8. css 实现球里装水

    <template> <div class="container">     <div class="wave"></ ...

  9. style设置 三个 竖线隔得太近了,这个属性和值 设置让他们分开一点

    ||| // html letter-spacing: 0.2em; // css

  10. Elasticsearch上手指南

    目录 ElasticStack及Elasticsearch介绍 Elasticsearch安装 Elasticsearch入门 Elasticsearch配置 Elasticsearch REST A ...