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