当前位置: 首页 > 编程日记 > 正文

Java的List和Json转换以及StringRedisTemplate往redis存泛型对象

List转Json

List<User> user= new ArrayList();
String str = JSON.toJSONString(user);

Json 转List方法一

List<User> user= JSON.parseArray(json,User.class); 

如果是泛型方法需要使用TypeReference

Json 转List 方法二

String json = "[{}]"; 
List<user> user= JSON.parseObject(json,new TypeReference<List<User>>(){});

泛型T

Json 转List方法三

List<T> students = JSON.parseObject(listCache,new TypeReference<List<T>>(){});

综合例子:Springboot环境下利用StringRedisTemplate往redis存泛型对象

一开始要注入下StringRedisTemplate

@Autowired
private StringRedisTemplate redisTemplate;

Redis获取值不存在就从数据库取出来json化存缓存,存在则直接反序列化json为List

List<T> list;
String listCache=redisTemplate.opsForValue().get(key);
if(listCache!=null){list = JSON.parseObject(listCache,new TypeReference<List<T>>(){});
}
else {list = userService.getAllList();redisTemplate.opsForValue().set(key, JSON.toJSONString(list), 60 * 1, TimeUnit.SECONDS);
}

附录:TypeReference源码

package com.alibaba.fastjson;import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;import com.alibaba.fastjson.util.ParameterizedTypeImpl;
import com.alibaba.fastjson.util.TypeUtils;/** * Represents a generic type {@code T}. Java doesn't yet provide a way to* represent generic types, so this class does. Forces clients to create a* subclass of this class which enables retrieval the type information even at* runtime.** <p>For example, to create a type literal for {@code List<String>}, you can* create an empty anonymous inner class:** <pre>* TypeReference&lt;List&lt;String&gt;&gt; list = new TypeReference&lt;List&lt;String&gt;&gt;() {};* </pre>* This syntax cannot be used to create type literals that have wildcard* parameters, such as {@code Class<?>} or {@code List<? extends CharSequence>}.*/
public class TypeReference<T> {static ConcurrentMap<Type, Type> classTypeCache= new ConcurrentHashMap<Type, Type>(16, 0.75f, 1);protected final Type type;/*** Constructs a new type literal. Derives represented class from type* parameter.** <p>Clients create an empty anonymous subclass. Doing so embeds the type* parameter in the anonymous class's type hierarchy so we can reconstitute it* at runtime despite erasure.*/protected TypeReference(){Type superClass = getClass().getGenericSuperclass();Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];Type cachedType = classTypeCache.get(type);if (cachedType == null) {classTypeCache.putIfAbsent(type, type);cachedType = classTypeCache.get(type);}this.type = cachedType;}/*** @since 1.2.9* @param actualTypeArguments*/protected TypeReference(Type... actualTypeArguments){Class<?> thisClass = this.getClass();Type superClass = thisClass.getGenericSuperclass();ParameterizedType argType = (ParameterizedType) ((ParameterizedType) superClass).getActualTypeArguments()[0];Type rawType = argType.getRawType();Type[] argTypes = argType.getActualTypeArguments();int actualIndex = 0;for (int i = 0; i < argTypes.length; ++i) {if (argTypes[i] instanceof TypeVariable &&actualIndex < actualTypeArguments.length) {argTypes[i] = actualTypeArguments[actualIndex++];}// fix for openjdk and android envif (argTypes[i] instanceof GenericArrayType) {argTypes[i] = TypeUtils.checkPrimitiveArray((GenericArrayType) argTypes[i]);}// 如果有多层泛型且该泛型已经注明实现的情况下,判断该泛型下一层是否还有泛型if(argTypes[i] instanceof ParameterizedType) {argTypes[i] = handlerParameterizedType((ParameterizedType) argTypes[i], actualTypeArguments, actualIndex);}}Type key = new ParameterizedTypeImpl(argTypes, thisClass, rawType);Type cachedType = classTypeCache.get(key);if (cachedType == null) {classTypeCache.putIfAbsent(key, key);cachedType = classTypeCache.get(key);}type = cachedType;}private Type handlerParameterizedType(ParameterizedType type, Type[] actualTypeArguments, int actualIndex) {Class<?> thisClass = this.getClass();Type rawType = type.getRawType();Type[] argTypes = type.getActualTypeArguments();for(int i = 0; i < argTypes.length; ++i) {if (argTypes[i] instanceof TypeVariable && actualIndex < actualTypeArguments.length) {argTypes[i] = actualTypeArguments[actualIndex++];}// fix for openjdk and android envif (argTypes[i] instanceof GenericArrayType) {argTypes[i] = TypeUtils.checkPrimitiveArray((GenericArrayType) argTypes[i]);}// 如果有多层泛型且该泛型已经注明实现的情况下,判断该泛型下一层是否还有泛型if(argTypes[i] instanceof ParameterizedType) {return handlerParameterizedType((ParameterizedType) argTypes[i], actualTypeArguments, actualIndex);}}Type key = new ParameterizedTypeImpl(argTypes, thisClass, rawType);return key;}/*** Gets underlying {@code Type} instance.*/public Type getType() {return type;}public final static Type LIST_STRING = new TypeReference<List<String>>() {}.getType();
}

TypeReference的存在是因为java中子类可以获取到父类泛型的真实类型。

其中核心的方法是:getActualTypeArguments,它可以得到父类的反省类型

ParameterizedType是一个记录类型泛型的接口, 继承自Type,一共三方法:

Type[] getActualTypeArguments(); //返回泛型类型数组
Type getRawType(); //返回原始类型Type
Type getOwnerType(); //返回 Type 对象,表示此类型是其成员之一的类型。
https://yq.aliyun.com/articles/609441

Map<String, Integer> intMap = new HashMap<>();System.out.println("getSuperclass:" + intMap.getClass().getSuperclass());System.out.println("getGenericSuperclass:" + intMap.getClass().getGenericSuperclass());Type type = intMap.getClass().getGenericSuperclass();if (type instanceof ParameterizedType) {ParameterizedType p = (ParameterizedType)type;for (Type t : p.getActualTypeArguments()) {System.out.println("getActualTypeArguments>>>"+t);}}

扩展阅读Java如何获得泛型类的真实类型:

package com.paopaoedu.springboot.demo;import com.paopaoedu.springboot.bean.User;import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;public class BaseDao<T>{private Class<T> clazz;// 使用反射技术得到T的真实类型public Class getRealType(){Class c=this.getClass();//getSuperclass()获得该类的父类System.out.println("getSuperclass        >>>"+c.getSuperclass());//getGenericSuperclass()获得带有泛型的父类System.out.println("getGenericSuperclass >>>"+c.getGenericSuperclass());//Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。Type type=c.getGenericSuperclass();System.out.println("Type                 >>>"+type);//ParameterizedType参数化类型,即泛型// 获取当前new的对象的泛型的父类类型ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();// 获取第一个类型参数的真实类型this.clazz = (Class<T>) pt.getActualTypeArguments()[0];c=(Class) pt.getActualTypeArguments()[0];System.out.println(c);return clazz;}}class userdemo extends BaseDao<User>{public static void main(String[] args) {userdemo classB = new userdemo();Class realType = classB.getRealType();System.out.println(realType.getName());}
}

相关文章:

【MATLAB】符号数学计算(一):符号对象的创建

一、符号对象的创建命令 1、函数命令sym( ) variablesym(A,flag)Ssym(A,flag) 如果A是(不带单引号)是一个数字、数值矩阵或者数值表达式&#xff0c;则输出结果是将数值对象转换成的符号对象。 如果A(带单引号)是一个字符串&#xff0c;输出结果则是将字符串转换成的符号对象…

分布式session一致性问题

传统的网站结构&#xff08;并发量不大&#xff0c;没有session的不一致的问题。传统的网站结构图&#xff1a; **结论&#xff1a;**从图中可以看出在传统的网站结构中&#xff0c;所有的客户端都连接一个服务器&#xff0c;每个客户端发送过来的请求都被该服务器处理&#…

切换阿里云maven源解决maven中央仓库下载太慢卡顿的问题

maven默认官方的中央仓库有时候很慢下载jar甚至会卡住&#xff0c;那么你可以切换到阿里云的maven源 在本地的maven文件夹新建settings.xml <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.…

【MATLAB】符号数学计算(二):符号运算中的运算符和函数

一般的这里就不再列举 1、算术运算符号 运算符号“ ”、“ . ”分别实现矩阵的共轭转置和非共轭转置。 >> syms a b c d; >> Asym([a,b;c,d])A [ a, b] [ c, d]>> R1AR1 [ conj(a), conj(c)] [ conj(b), conj(d)]>> R2A.R2 [ a, c] [ b, d] 2、关…

2015级C++第14周实践项目 模板

【项目1-排序函数模板】 已知 void Sort(int a[],int size); void Sort(double a[],int size); 是一个函数模板的两个实例&#xff0c;其功能是将数组a中的前size个元素按从小到大顺序排列。试设计这个函数模板。 【项目2-两个成员的类模板】 设有如下的类声明&#…

11月18日珠三角城市人口迁徙可视化(和弦图)

2019独角兽企业重金招聘Python工程师标准>>> 一、导入数据&#xff0c;初始图 > library(circlize) > data<-read.table("C:/Users/cuiy/Desktop/PersonalData/qianxi.csv",sep",",headerT) > head(data)from to value 1 中山 珠…

【MATLAB】符号数学计算(三):符号的精度计算

符号计算的一个非常显著的特点是&#xff0c;由于计算中不会出现舍入误差&#xff0c;从而可以得到任意精度的数值解。 &#xff08;要计算精确&#xff0c;就要牺牲计算时间和储存空间&#xff09; 符号工具箱中有三种不同类型的算术运算&#xff1a; 数值类型&#xff1a;…

SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;1&#xff09;下载地址&#xff1a;https://github.com/ccgus/fmdb &#xff08;2&#xff09;注意点 ——语句可以带分号“&#xff1b;”&#xff0c;也可以省略分号。 ——同样需要添加“libsqlite3.dyli…

Linus采访对Linux对git和对代码品味的理解

【Linus对办公环境的要求】 Linus大师说他11岁就开始编程,他说他是一个喜欢安静和不合群的人。 图中是他和他的弟弟,看来少儿编程还是很重要的,大师21岁写出linux0.0.1最初的内核。 图中是他的家,也是Linux的总部,非常简单的办公环境,只有显示器,大师喜欢安静,所以不想…

04 集成学习 - Boosting - AdaBoost算法构建

03 集成学习 - Boosting - AdaBoost算法原理 十、AdaBoost算法构建 上一章最后说明了每个基模型的权值α是如何求得的&#xff0c;于是我就可以对模型进行更新操作了。 构建过程一 1、假设数据集&#xff1a; T{(X1,Y1),(X2,Y2),...(Xn,Yn)} 2、初始化训练数据权重分布&#xf…

Redis源码分析 List实现

在版本3.2之前&#xff0c;Redis中的列表是 ziplist 和 linkedlist 实现的&#xff0c;在3.2之后&#xff0c;由quicklist实现。 双向链表linkedlist在表的两端进行push和pop操作非常方便&#xff0c;但是地址不连续&#xff0c;而且需要保持额外的指针。 ziplist是连续内存&am…

Linux cut命令

用途 文本文件按列提取。 特点 过于简单&#xff0c;只能处理固定格式的分隔符&#xff0c;分隔符不能使用正则表达式。 用法 命令基本格式 -b、-c、-f分别表示字节、字符、字段&#xff08;即byte、character、field&#xff09;&#xff1b;list表示-b、-c、-f操作范围&#…

【MATLAB】符号数学计算(四):符号表达式操作

一、符号表达式合并 Rcollect(S)&#xff1a;将表达式S中相同次幂的项合并。S可以是一个表达式&#xff0c;也可以是一个符号矩阵。Rcollect(S,v)&#xff1a;将表达式中S中v的相同次幂进行合并。如果v没有指定&#xff0c;则默认将含有x的相同次幂的项进行合并。 >> sy…

Alpha冲刺——day1

Alpha冲刺——day1 作业链接 Alpha冲刺随笔集 github地址 站立式会议 会议安排&#xff1a;alpha冲刺的第一天&#xff0c;我们站立式会议讨论了我们接下来的安排&#xff0c;做出大致的规划&#xff0c;并针对之前的原型设计&#xff0c;讨论了界面设计的大概 项目进展项目进展…

一步一步学习VirtualBox安装CentOS7和CentOS8

个人学习研究Linux推荐安装VirtualBoxCentOS。 CentOS7和CentOS8的安装实际上是非常相似的&#xff0c;改变的地方不多&#xff0c;从CentOS7开始和CentOS6相比改变是非常大的。 VirtualBox本身是免费的&#xff0c;足够正常学习应用了&#xff0c;安装CentOS是因为企业线上大…

建模原语:四象图

原文地址&#xff1a;http://www.douban.com/note/164191021/ “模型、状态和行为特征、场景”和“四象图”&#xff0c;建模观的命名与立象。 建模原语:四象图 作者&#xff1a;achieveideagmail.com 命名&#xff1a;模型、结构特征、行为特征、场景&#xff08;及其规约&…

【MATLAB】符号数学计算(五):符号函数的替换

一、subs替换函数 Rsubs(S)&#xff1a;用工作区中的变量值替换符号表达式中的某一特定符号。Rsubs(S,New)&#xff1a;用新符号变量New来替换符号表达式S中的默认变量。Rsubs(S,Old,New) >> syms x y >> fsym(x^2x*yy^2)f x^2 x*y y^2>> x2; >> su…

Ubuntu阿里云搭建Mono.net环境

查看磁盘信息 我们买的系统默认情况下只是安装了系统&#xff0c;而数据盘需要自己挂载&#xff0c;例如我这里的系统占用20多G&#xff0c;还有40多G的数据盘默认是没有挂载的&#xff0c;首先我们运行df -h查看&#xff1a; rootAY1212241134392134698:~# df -hFilesystem Si…

MongoDB分布式原理以及read-preference和readConcern解决读写一致性问题

MongoDB词汇表&#xff1a; https://docs.mongodb.com/manual/reference/glossary/#term-replica-set MongoDB分布式原理 primary In a replica set, the primary is the member that receives all write operations. See Primary. 在副本集中&#xff0c;主库是接收所有写…

Lua(Codea) 中 table.insert 越界错误原因分析

2019独角兽企业重金招聘Python工程师标准>>> Lua(Codea) 中 table.insert(touches, touch.id, touch) 越界错误原因分析 背景介绍 在 Codea 上运行其他人以前写的代码时, 发现某段处理 touch 事件的代码总是报错, 开始报浮点数没有整型的表示, 修改代码增加类型转换…

【MATLAB】符号数学计算(六):符号函数的操作

一、复合函数的操作 compose(f,g)&#xff1a;返回复合函数f(g(y))&#xff0c;此处ff(x)&#xff0c;gg(y)&#xff1b;compose(f,g,x,z)&#xff1a;返回自变量是z的复合函数f(g(z)) >> syms x y >> fsym(xx^-1); >> gsym(sin(x)); >> h(1y^2); >…

java中如何应对读改写场景

前言 volatile可以确保数据及时刷新到主存&#xff0c;但是对于读改写场景还是无能为力 举个例子 public class ConcurrentHashMapExample {public static void main(String[] args) throws InterruptedException {Map<String, Long> ordersMap new ConcurrentHashMap&l…

Apache Hudi的写时复制和读时合并

Apache Hudi http://hudi.apache.org/ http://hudi.apache.org/docs/quick-start-guide.html Hudi是什么 Hudi将流处理带到大数据&#xff0c;提供新数据&#xff0c;同时比传统批处理效率高一个数量级。 Hudi可以帮助你构建高效的数据湖&#xff0c;解决一些最复杂的底层…

顶尖程序员不同于常人的 5 个区别

2019独角兽企业重金招聘Python工程师标准>>> 《The Effective Engineer》的作者在写书的过程中&#xff0c;为了了解那些顶级程序员和普通程序员的区别&#xff0c;采访了很多硅谷顶级科技公司的顶尖软件工程师。他发现这些给世界带来巨大影响的的工程师们至少有以下…

【MATLAB】符号数学计算(七):符号微积分、符号微分方程求解、符号代数方程求解

一、符号表达式的极限 limit(F,x,a)&#xff1a;求当时&#xff0c;符号表达式F的极限。limit(F,a)&#xff1a;符号表达式F采用默认自变量&#xff08;可由函数findsym求得&#xff09;&#xff0c;该函数求F的自变量趋于a时的极限值。limit(F)&#xff1a;符号表达式采用默认…

Qt运行时中文乱码的解决办法

QT5的解决办法&#xff0c;在类之前添加&#xff1a;   #pragma execution_character_set("utf-8")QT4解决办法&#xff1a; QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());转载于:https://www.cnblogs.com/bjxingch/articles/9992998.html

更换yum的源为阿里云或者网易

1.备份原本的yum源&#xff1a; #mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载阿里云的yum源&#xff1a; CentOS6,CentOS7,CentOS8下对应的即可 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Ce…

socket编程:多路复用I/O服务端客户端之poll

一. 关于poll对于IO复用模型&#xff0c;其优点无疑是免去了对一个个IO事件就绪的等待&#xff0c;转而代之的是同时对多个IO数据的检测&#xff0c;当检测等待的事件中至少有一个就绪的时候&#xff0c;就会返回告诉用户进程“已经有数据准备好了&#xff0c;快看看是哪个赶紧…

【MATLAB】符号数学计算(八):符号分析可视化

一、funtool分析界面 在命令行窗口中输入&#xff1a; funtool 这里就说一下第四排&#xff1a; Insert&#xff1a;把当前激活窗的函数写入列表Cycle&#xff1a;依次循环显示fxlist中的函数Delete&#xff1a;从fxlist列表中删除激活窗的函数Reset&#xff1a;使计算器恢复…

java 根据实体对象生成 增删改的SQL语句 ModelToSQL

2019独角兽企业重金招聘Python工程师标准>>> java 根据实体对象生成 增删改的SQL语句 ModelToSQL 转载于:https://my.oschina.net/miaojiangmin/blog/2907010