前言
- Java开发中经常遇到实体互转的情况,我们大多使用apache提供的beanutils工具即可完成数据的转换。
- 对于我们自身而言,经常为了躲避实体的字段映射,我们经常会将实体转换为map ; 或者将map转换实体的操作,今天我们聊聊实体、map、json三者的转换关系
实体转map
- bean转map其实很简单,我们只需要反射获取实体的字段。然后通过反射获取对应的值,分别放入到map中就可以了。
public static Map<String, Object> bean2Map(Object obj){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
resultMap.put(field.getName(), field.get(obj));
}
} catch (Exception e) {
logger.error(e);
}
return resultMap;
}
map转实体
- map转实体和实体转map有一定的区别。实体转map的时候是实体有的都可以转换到map中。可以说是全局转换
- 但是map转实体就不是全局转换了,不是看你有什么而是看我要什么。就是这么强硬。map比如有100对键值对。但是实体中只有两个属性。那么不好意思最终转换出来的只有两个属性能够被有效的使用
- map转实体也是借助bean的反射,去map中查找。在通过反射赋值给bean属性。整个过程和bean转map相反
- 但是map转实体就涉及到泛型的操作。所以在方法签名上添加泛型
public static <T> T map2Bean(Map<?, ?> map, Class<T> cls) {
T obj = null;
try {
obj = cls.newInstance();
Field[] declaredFields = cls.getDeclaredFields();
for (Field field : declaredFields) {
String fieldName = field.getName();
if(map.containsKey(fieldName)){
field.setAccessible(true);
if (map.get(fieldName) != null) {
field.set(obj, DataType.valueOf(field.getType().getSimpleName(), map.get(fieldName)));
}
}
}
} catch (Exception e) {
logger.error(e);
}
return obj;
}
json转实体
- json转实体就很简单了,在JSONobject类中提供了丰富的类型转换,上面提到的map和bean的互转其实都是可以借助JsonObject进行转换。
public static <T> T json2Bean(String jsonText , Class<T> cls){
T bean = null;
JSONObject jsonObject = JSONObject.parseObject(jsonText);
try {
bean = jsonObject.toJavaObject(cls);
} catch (Exception e) {
logger.error(e);
}
return bean;
}
json转map
public static Map<Object, Object> json2Map(String jsonText){
System.out.println("1.1.1");
Map<Object, Object> map = new HashMap<Object, Object>();
JSONObject jsonObject = JSONObject.parseObject(jsonText);
for (Object key : jsonObject.keySet()) {
map.put(key, jsonObject.get(key));
}
return map;
}
总结
- 类型转换使我们常见的东西,类似于这些东西我们封装自己工具类,方便快速开发