Java对象与Map间相互转换
将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间相互转换的更多相关文章
- java对象转map
/** * java对象转map * @param obj * @return * @throws IllegalAccessException * @throws IllegalArgumentEx ...
- 使用jackson对Java对象与JSON字符串相互转换的一些总结
本文为菠萝大象原创,如要转载请注明出处.http://www.blogjava.net/bolo 代码无真相,为了最简单的说明,我直接上代码. public class User { private ...
- java 对象转Map方法Demo
/** * 用于对Object进行解析并且转换成Map键值对的形式 * */ public class ObjectUtils { private static final String JAVAP ...
- java对象与map对象相互转换
/** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<String ...
- JAVA List与数组间相互转换
1.list转数组 例如: List<String> list = new ArrayList<String>(); list.add("aa"); li ...
- JAVA中将对象转为Map类型
之前讲过将Map转为JAVA对象的文章,那么问题来了,如果要把JAVA对象转为Map,又该怎么操作呢?这里亲测了2个方法可行,但目前这2个方法都是基于简单JAVA Bean的情况(即Bean中不能嵌套 ...
- Java对象表示方式2:XStream实现对对象的XML化
上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 ...
- java对象表示方式--XStream
对象表示有各种各样的方式,序列化只是其中的一种而已.表示一个对象的目的无非就是为了对象<---->IO之间相互认识,至于怎么认识,那就有很多选择了.除了之前讲过的序列化,还可以选择将数据J ...
- Json:Java对象和Json文本转换工具类
Json 是一个用于 Java 对象 和 Json 文本 相互转换的工具类. 安装 下载源码 git clone https://github.com/njdi/durian.git 编译源码 cd ...
随机推荐
- JS图片灯箱(lightBox)效果基本原理和demo
到年底了,项目不怎么忙,所以有空特地研究了下KISSY中源码JS灯箱效果,感觉代码比较简单,所以就按照他们的思路依赖于Jquery框架也封装了一个,特地分享给大家,以前经常看到网上很多这样的插件,感觉 ...
- Kafka设计解析(二十)Apache Flink Kafka consumer
转载自 huxihx,原文链接 Apache Flink Kafka consumer Flink提供了Kafka connector用于消费/生产Apache Kafka topic的数据.Flin ...
- Java中的单利模式介绍
单利模式:本来是不准备写的,但是最近发现好多公司面试时都会或多或少的提到单利模式,因此今天把单利模式拉出来说说. 定义:只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且 ...
- 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明
程序发布后出现问题: 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明 解决办法: 1.安装了odac12. ODTwithODAC121010.z ...
- Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储? - z
这几天在做Android应用的远程更新功能,将下载的更新包放在移动设备上指定的目录.用的是 Environment.getExternalStorageDirectory() 这个方法,然后在获取的 ...
- 20155207 《网络对抗》 Exp9 Web安全基础
20155207 <网络对抗> Exp9 Web安全基础 实验内容 关于WebGoat Cross-Site Scripting(XSS)练习 Injection Flaws练习 CSRF ...
- 【第十一课】Tomcat原理解析【转】
目录 一.Tomcat顶层架构 二.Tomcat顶层架构小结: 三.Connector和Container的微妙关系 四.Connector架构分析 五.Container架构分析 六.Contain ...
- 阿里云OSS不同账号之间的迁移
目录 一.需求说明 二.Ossimport概述 三.配置运行环境 1.配置jdk环境 2.部署方式 3.下载并部署ossimport 四.修改单机Job的配置文件local_job.cfg 五.执行迁 ...
- 洛咕 P4491 [HAOI2018]染色
显然颜色数量不会超过\(lim=\min(m,n/S)\) 考虑容斥,计算恰好出现了\(S\)次的颜色有至少\(i\)种的方案数\(f[i]\),钦定\(i\)种颜色正好放\(S\)种 有\(m\)种 ...
- Linux每天一个命令:iperf
iperf命令 Iperf 是一个网络性能测试工具.Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失.下载地址:https: ...