将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. Git同时使用不同平台代码仓库

    问题描述 公司项目使用代码仓库为gitinn/gitlab等,个人项目使用github进行托管,而公司项目和个人项目设置的邮箱和用户名是不同的,而ssh的密钥对又是基于这两个信息生成的,所以此时想要同 ...

  2. anaconda查看删除增加镜像源

    # 查看显示原来的镜像源(base) [jiangshan@localhost ~]$ conda config --showadd_anaconda_token: Trueadd_pip_as_py ...

  3. JAVA框架Struts2--配置讲解

    一.配置讲解: <struts> <package name="oop" namespace="/" extends="struts ...

  4. 使用PHPMail发送邮箱(163邮箱为例)

    1.下载phpmail压缩包,并解压. 2.创建index.html文件.并写入代码. <form action="" method="post"> ...

  5. 「PKUSC2018」最大前缀和 LOJ#6433&BZOJ5369

    分析: 这个题非常的棒,目测如果去了能AC... 我们考虑一个序列是如何构成的——一个后缀>0的序列,和一个前缀<0的序列 问题可以简化为求出当前缀和为状态S的所有数的和的时候,S满足后缀 ...

  6. Bagging(R语言实现)—包外错误率,多样性测度

    1.      Bagging Bagging即套袋法,其算法过程如下: 从原始样本集中抽取训练集.每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次 ...

  7. VS编程,WPF中,获取鼠标相对于当前屏幕坐标的一种方法

    原文:VS编程,WPF中,获取鼠标相对于当前屏幕坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/det ...

  8. java 锁白话

    一.锁 1.可见性: 定义:数据对所有线程可见 原因:cpu操作数据时会把数据读取到内存中去,可以理解为值做了备份,但是备份数据和原始数据在后续操作中不一定一致 实现:java使用volite关键字来 ...

  9. 软件测试 —— Bug

    [Bug规范] Bug标题中需包含Bug的具体位置并以[]标注 举例:[模块-子模块-页面]XXXXXXXXXXXX Bug标题尽量简明 做什么操作 + 出现什么结果,比如(点击提交按钮,出现卡顿现象 ...

  10. 谷歌商店高级搜索 Google play advanced search

    这个问题一直搜索了很久都没有答案,后来在StackOverflow上提问,很久也没人回答. 详见我的SO:https://stackoverflow.com/questions/52939493/ho ...