TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

java泛型反序列化

Laughing博主
2021-10-22
/
0 评论
/
1,665 阅读
/
370 个字
/
百度已收录
10/22
本文最后更新于2024年03月16日,已超过188天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

其实不管前后端交互还有API接口,我个人更倾向于使用实体(DTO、VO)啥的,但是,有时候也不得不用Map等进行数据交互。
一般而言,前后端或者接口之间交互都是通过JSON进行的,而我们在使用Map的时候,一般都是使用的泛型类,而不是使用原始类型,比如Map<String,string>,那么我们来看下下面一段代码。

Map<String,String> bookMap = new HashMap<>();
bookMap.put("author","张三");
bookMap.put("name","山海经");
String bookMapString = JSONObject.toJSONString(bookMap);
log.info(bookMapString);

我们创建一个Map<String,String>,并将其序列化成字符串,如果我们放过来,想将字符串在反序列化成Map,我们首先想到的可能就像下面这样。

Map bookMapNew = JSONObject.parseObject(bookMapString);
log.info(String.valueOf(bookMapNew));

程序有错吗?当然没错,但是优雅嘛,肯定是不优雅。其实这个时候,idea会给我们一个提示
Raw use of parameterized class 'Map',大概意思就是说这个类要使用泛型,如果不使用泛型,我们其实丢失了类型的安全性。
这个时候,我们就想到了parseObject()的重载方法,通过第二个参数,传递进去类型,如果我们是普通的类,传递一个class进去是没问题的。
比如我们改写一下上面反序列化的方法

Map<String,String> bookMapNew = JSONObject.parseObject(bookMapString,Map.class);

这个时候,idea又会给我们一个提示
大意就是类型转换没有校验。
那么有没有更加完美的方法呢,有的,那就是TypeReference类,我们继续改造代码如下

Map<String,String> bookMapNew = JSONObject.parseObject(bookMapString,new TypeReference<Map<String,String>>(){});

这回idea终于没有提示了
运行一下,结果也是正确的

Java
朗读
赞(1)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

本文链接:

https://www.xiangcaowuyu.net/java/java-generic-deserialization.html(转载时请注明本文出处及文章链接)

评论 (0)