将Java对象转为一个Map,以及将map转为对应Java对象,代码如下:

public class BeanMapUtil {

    private static ConcurrentHashMap<String, Map<String, String>> beanFieldCache = new ConcurrentHashMap<>();

    public static Map<String, String> toMap(Object bean) {
if (bean == null) {
return null;
}
Map<String, String> map = Maps.newHashMap();
Map<String, String> beanFieldMap = getBeanFields(bean);
try {
for (Map.Entry<String, String> fieldEntry : beanFieldMap.entrySet()) {
String fieldName = fieldEntry.getKey();
String mapKey = fieldEntry.getValue();
map.put(mapKey, BeanUtils.getProperty(bean, fieldName));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return map;
} public static void toBean(Map<String, String> map, Object result) {
if (map.isEmpty()) {
return;
}
try {
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
BeanUtils.setProperty(result, toBeanFieldName(key), value);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} private static Map<String, String> getBeanFields(Object bean) {
if (bean == null) {
return null;
}
if (beanFieldCache.contains(bean.getClass().getName())) {
return beanFieldCache.get(bean.getClass().getName());
}
Map<String, String> map = Maps.newHashMap();
for (Class clazz = bean.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
map.put(fieldName, toMapKey(fieldName));
}
}
beanFieldCache.put(bean.getClass().getName(), map);
return map;
} private static String toMapKey(String fieldName) {
if (fieldName == null) {
return null;
}
StringBuilder underLineName = new StringBuilder();
for (int i = 0; i < fieldName.length(); i++) {
char c = fieldName.charAt(i);
if (Character.isUpperCase(c)) {
underLineName.append("_");
}
underLineName.append(upperCaseToLowerCase(c));
}
return underLineName.toString();
} private static char upperCaseToLowerCase(char c) {
if (c >= 'A' && c <= 'Z') {
c += 32;
}
return c;
} private static String toBeanFieldName(String key) {
if (key == null) {
return null;
}
StringBuilder camelFieldName = new StringBuilder();
for (int i = 0; i < key.length(); i++) {
char c = key.charAt(i);
if (c == '_' && i + 1 < key.length()) {
camelFieldName.append(lowerCaseToUpperCase(key.charAt(++i)));
} else {
camelFieldName.append(c);
}
}
return camelFieldName.toString();
} private static char lowerCaseToUpperCase(char c) {
if (c >= 'a' && c <= 'z') {
c -= 32;
}
return c;
} }

测试代码:

public class Parent {

    private String parentField;

    public String getParentField() {
return parentField;
} public void setParentField(String parentField) {
this.parentField = parentField;
}
} public class Child extends Parent { private String childFieldA; private String childFieldB; private String childFieldC; public String getChildFieldA() {
return childFieldA;
} public void setChildFieldA(String childFieldA) {
this.childFieldA = childFieldA;
} public String getChildFieldB() {
return childFieldB;
} public void setChildFieldB(String childFieldB) {
this.childFieldB = childFieldB;
} public String getChildFieldC() {
return childFieldC;
} public void setChildFieldC(String childFieldC) {
this.childFieldC = childFieldC;
}
} public class BeanMapTest { public static void main(String[] args) {
Child child = new Child();
child.setParentField("p1");
child.setChildFieldA("c1");
child.setChildFieldB("c2");
child.setChildFieldC("c3");
Map<String, String> map = BeanMapUtil.toMap(child);
System.out.println(map); Child result = new Child();
BeanMapUtil.toBean(map, result);
System.out.println(JSON.toJSONString(result));
} }

运行结果:

{parent_field=p1, child_field_a=c1, child_field_c=c3, child_field_b=c2}
{"childFieldA":"c1","childFieldB":"c2","childFieldC":"c3","parentField":"p1"}

Java对象与Map间相互转换的更多相关文章

  1. java对象转map

    /** * java对象转map * @param obj * @return * @throws IllegalAccessException * @throws IllegalArgumentEx ...

  2. 使用jackson对Java对象与JSON字符串相互转换的一些总结

    本文为菠萝大象原创,如要转载请注明出处.http://www.blogjava.net/bolo 代码无真相,为了最简单的说明,我直接上代码. public class User { private  ...

  3. java 对象转Map方法Demo

    /** * 用于对Object进行解析并且转换成Map键值对的形式 * */ public class ObjectUtils { private static final String JAVAP ...

  4. java对象与map对象相互转换

    /** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<String ...

  5. JAVA List与数组间相互转换

    1.list转数组 例如: List<String> list =  new ArrayList<String>(); list.add("aa"); li ...

  6. JAVA中将对象转为Map类型

    之前讲过将Map转为JAVA对象的文章,那么问题来了,如果要把JAVA对象转为Map,又该怎么操作呢?这里亲测了2个方法可行,但目前这2个方法都是基于简单JAVA Bean的情况(即Bean中不能嵌套 ...

  7. Java对象表示方式2:XStream实现对对象的XML化

    上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 ...

  8. java对象表示方式--XStream

    对象表示有各种各样的方式,序列化只是其中的一种而已.表示一个对象的目的无非就是为了对象<---->IO之间相互认识,至于怎么认识,那就有很多选择了.除了之前讲过的序列化,还可以选择将数据J ...

  9. Json:Java对象和Json文本转换工具类

    Json 是一个用于 Java 对象 和 Json 文本 相互转换的工具类. 安装 下载源码 git clone https://github.com/njdi/durian.git 编译源码 cd ...

随机推荐

  1. JAVA框架 Spring 引入多个配置文件

    1.如果配置文件比较长,可以分多个配置文件.有两种方式: 1)在主配置文件加标签<import/> <import resource="jd/com/other/appli ...

  2. C. Permutation Cycle

    For a permutation P[1... N] of integers from 1 to N, function f is defined as follows: Let g(i) be t ...

  3. jquery ajax error函数和及其参数详细说明(转载)

    使用jquery的ajax方法向服务器发送请求的时候,常常需要使用到error函数进行错误信息的处理,本文详细的说明了ajax中error函数和函数中各个参数的用法.一般error函数返回的参数有三个 ...

  4. 使用Highcharts生成折线图_at last

    //数据库数据的读取,读取数据后数据格式的转换,还有highchart数据源的配置,伤透了脑筋. anyway,最终开张了.哈哈! 数据库连接:conn_orcale.php <?php $db ...

  5. 01-Maven功能特点

    1.Maven简介 2.Maven重要性 3.Maven原理

  6. ASP.NET Core 3.0 实战:构建多版本 API 接口

    第一次在博客写分享,请多多捧场,如有歧义请多多包含! 因为业务需求发展需要,所以API接口的变更升级是必不可少的事情,而原有的接口是不可能马上停止使用的.例如:Login接口为例,1.0版本之返回用户 ...

  7. 大数据入门第二十一天——scala入门(一)并发编程Actor

    注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...

  8. go语言之行--基础部分

    一.数据类型 布尔型 布尔类型 - 由两个预定义常量组成:true.false,默认值为false package main import "fmt" func main() { ...

  9. Django Rest Framework源码剖析(五)-----解析器

    一.简介 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数据格式,比如xml,所以需要解析这类数 ...

  10. C++和python的变量对比

    <C++中的this和Python的self对比>基本都是针对函数而言的,从变量的角度看,也有相同之处. C++中,类中定义的变量一般叫做成员变量,或者说是成员属性,它只属于实例对象,只有 ...