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 ...
随机推荐
- 测试计划&性能测试分析报告模板(仅供参考)
一.测试计划 1. 引言 1.1 编写目的 2. 参考文档 3. 测试目的 4. 测试范围 4.1 测试对象 4.2 需要测试的特性 4.3 无需测试的特性 5. 测试启动与结束准则 5.1 ...
- 基于TLS证书手动部署kubernetes集群(下)
一.master节点组件部署 承接上篇文章--基于TLS证书手动部署kubernetes集群(上),我们已经部署好了etcd集群.flannel网络以及每个节点的docker,接下来部署master节 ...
- POJ2531&&1416&&2676&&1129
搜索专题的最后一块了,也告别了这些老的东西了 接下来就是些全新的内容了啊! 这次的标签是简单搜索技巧和剪枝,也就是优化爆搜 当然,像Dancing links这样的玄学操作还是没有的 2531 题意: ...
- Javascript如何实现GPU加速?
一.什么是Javascript实现GPU加速? CPU与GPU设计目标不同,导致它们之间内部结构差异很大.CPU需要应对通用场景,内部结构非常复杂.而GPU往往面向数据类型统一,且相互无依赖的计算.所 ...
- Azure 基础:Queue Storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在前文中介绍了 File Storage 的基本用 ...
- Python列表知识点讲解
增删改查 增 X.append函数是在原有列表中的末尾追加一个新的元素存放在列表中 X.extend() 将一个列表中的元素添加到另一个列表中,将所引用的原列表保持不变,同时extend还可以运用到, ...
- 为什么说LAXCUS颠覆了我的大数据使用体验
切入正题前,先做个自我介绍. 本人是从业三年的大数据小码农一枚,在帝都一家有点名气的广告公司工作,同时兼着大数据管理员的职责. 平时主要的工作是配合业务部门,做各种广告大数据计算分析工作,然后制成各种 ...
- 基于tensorflow使用全连接层函数实现多层神经网络并保存和读取模型
使用之前那个格式写法到后面层数多的话会很乱,所以编写了一个函数创建层,这样看起来可读性高点也更方便整理后期修改维护 #全连接层函数 def fcn_layer( inputs, #输入数据 input ...
- 人类又被AI碾压,这次是星际争霸
还记得2017年,那个血洗围棋界的“阿尔法狗”吗? 这个由谷歌旗下 DeepMind 公司开发的 AI ,对阵世界顶尖围棋选手,打出完全碾压式的战绩: AlphaGo vs. 樊麾 - 5 : ...
- dp算法之平安果路径问题c++
前文:https://www.cnblogs.com/ljy1227476113/p/9563101.html 在此基础上更新了可以看到行走路径的代码. 代码: #include <iostre ...