[JAVA] json 转Map,Map转实体对象,在mysql和redis的不同存储和解析方式
涉及3中类型:
Json字符串
Map<k,v>
实体对象
1、mysql
①将实体对象封装为Map类型,Map再转为Json,此方法较多,Gson和JSON都可以,不详解
②将字符串直接转化为Map,且Map的value值为实体对象:切忌强转,而应该使用new TypeReference()构造方法,这样便可通过Map的key值来获取对应的value值
Map<String,SplitMoneyRelust> breakMap = JSON.parseObject(order.getCorsUserBreak(), new TypeReference<HashMap<String,SplitMoneyRelust>>(){});
将Json转化为Map,再转化为实体对象(+++++++推荐++++++++)
必须经过两次JSON.parseObject()解析:
第一次只能将其转化为Map,且不能直接转为Map<k,v>
第二次将转化的Map再进行转为实体对象
Map map = JSON.parseObject(roomOrder.getCorsUserDinner(), Map.class);
SplitMoneyRelust split = JSON.parseObject(JSON.toJSONString(map), SplitMoneyRelust.class);
2、redis
①将定义好的Map对象存入redis中,推荐使用原生的redisTemplate,这样存入的数据前面会有一个@class标识,来指明是个Map类型
Map<String, FinanceRoomDateResult> dateMapping = new HashMap<>();
redisTemplate.opsForValue().set(BaseCommon.ROOM_DATE + year + "_" + room.getId(), dateMapping);
②将redis中的Map<k,v>对象取出,这里就可以直接使用强转了,因为存在redis中的@Class已经作为了标识;
Map<String, FinanceRoomDateResult> map = (Map<String, FinanceRoomDateResult>) redisTemplate.opsForValue().get(BaseCommon.ROOM_DATE + param.getYear() + "_" + room.getId());