java泛型反序列化

Laughing
2021-10-22 / 0 评论 / 1,789 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年03月16日,已超过307天没有更新,若内容或图片失效,请留言反馈。

其实不管前后端交互还有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终于没有提示了
运行一下,结果也是正确的

1

评论 (0)

取消