java中对象和Map互相转换的几种方式

在Java中,将对象和Map相互转换是常见的操作,可以通过不同的方式实现这种转换。以下是几种常见的方法以及示例说明:

1. 使用Hutool工具类

Hutool是一个优秀的Java工具包,提供了丰富的工具方法,其中就包括对象和Map之间转换的工具方法。

示例:

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import java.util.Map;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);// 对象转换为Map
Map<String, Object> personMap = BeanUtil.beanToMap(person);
System.out.println(personMap);  // 输出:{name=Alice, age=30}// Map转换为对象
Person newPerson = BeanUtil.mapToBean(personMap, Person.class, true);
System.out.println(newPerson.getName());  // 输出:Alice

Hutool的BeanUtil提供了beanToMapmapToBean等方法,可以方便地进行对象和Map之间的转换。这些方法减少了开发者的工作量,并且在性能和易用性方面做了一定的优化。

2. 使用Jackson库

Jackson是一个流行的Java库,可以方便地进行对象和JSON数据之间的转换。通过Jackson的ObjectMapper,可以将对象转换为Map,反之亦然。

示例:

import com.fasterxml.jackson.databind.ObjectMapper;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);ObjectMapper objectMapper = new ObjectMapper();// 对象转换为Map
Map<String, Object> personMap = objectMapper.convertValue(person, Map.class);
System.out.println(personMap);  // 输出:{name=Alice, age=30}// Map转换为对象
Person newPerson = objectMapper.convertValue(personMap, Person.class);
System.out.println(newPerson.getName());  // 输出:Alice

3. 使用反射实现通用转换

通过Java的反射机制,可以动态地获取和设置对象的属性,从而实现对象和Map之间的转换。

示例:

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;public class ObjectMapConverter {public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {Map<String, Object> map = new HashMap<>();Class<?> clazz = obj.getClass();for (Field field : clazz.getDeclaredFields()) {field.setAccessible(true);map.put(field.getName(), field.get(obj));}return map;}public static <T> T mapToObject(Map<String, Object> map, Class<T> clazz) throws IllegalAccessException, InstantiationException {T obj = clazz.newInstance();for (Map.Entry<String, Object> entry : map.entrySet()) {Field field = null;try {field = clazz.getDeclaredField(entry.getKey());field.setAccessible(true);field.set(obj, entry.getValue());} catch (NoSuchFieldException ignored) {}}return obj;}
}// 使用示例
class Person {private String name;private int age;// Getters and setters omitted for brevity
}Person person = new Person();
person.setName("Alice");
person.setAge(30);Map<String, Object> personMap = ObjectMapConverter.objectToMap(person);
System.out.println(personMap);  // 输出:{name=Alice, age=30}Person newPerson = ObjectMapConverter.mapToObject(personMap, Person.class);
System.out.println(newPerson.getName());  // 输出:Alice

4. 使用Gson库

Gson是Google提供的用于JSON序列化和反序列化的库,它可以帮助实现对象和JSON之间的相互转换,而JSON本身也是一种键值对的结构,因此可以很方便地转换为Map。

示例:

import com.google.gson.Gson;
import java.util.Map;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);Gson gson = new Gson();// 对象转换为JSON字符串再转换为Map
String json = gson.toJson(person);
Map<String, Object> personMap = gson.fromJson(json, Map.class);
System.out.println(personMap);  // 输出:{name=Alice, age=30}

5. 使用Apache Commons BeanUtils

Apache Commons BeanUtils是Apache软件基金会提供的工具类库,它提供了诸多方法简化了Java Bean对象和Map之间的转换。

示例:

import org.apache.commons.beanutils.BeanUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);// 对象转换为Map
Map<String, String> personMap = BeanUtils.describe(person);
System.out.println(personMap);  // 输出:{name=Alice, age=30, class=class Person}// Map转换为对象
Person newPerson = new Person();
BeanUtils.populate(newPerson, personMap);
System.out.println(newPerson.getName());  // 输出:Alice

6. 使用FastJSON工具

FastJSON是阿里巴巴开发的一个高性能的JSON库,除了JSON操作,它也提供了方便的方法来处理Java对象和JSON之间的转换。

示例:

import com.alibaba.fastjson.JSON;
import java.util.Map;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);// 对象转换为JSON字符串再转换为Map
String json = JSON.toJSONString(person);
Map<String, Object> personMap = JSON.parseObject(json, Map.class);
System.out.println(personMap);  // 输出:{name=Alice, age=30}

7. 使用CGLIB的BeanMap工具

CGLIB是一个强大的代码生成类库,其BeanMap类可以方便地将Java Bean转换为Map。

示例:

import net.sf.cglib.beans.BeanMap;
import java.util.Map;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);// 对象转换为BeanMap
BeanMap beanMap = BeanMap.create(person);
Map<String, Object> personMap = beanMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(personMap);  // 输出:{name=Alice, age=30}

8. 使用Introspector工具

Java的java.beans.Introspector提供了一些方法来分析类的属性、事件、方法等,可用于对象和Map之间的转换。

示例:

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);// 对象转换为Map
Map<String, Object> personMap = new HashMap<>();
try {for (PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(Person.class).getPropertyDescriptors()) {String name = propertyDescriptor.getName();if (!"class".equals(name)) {Object value = propertyDescriptor.getReadMethod().invoke(person);personMap.put(name, value);}}
} catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();
}
System.out.println(personMap);  // 输出:{name=Alice, age=30}

9. 使用MapStruct库

MapStruct是一个代码生成器,可以根据定义的映射关系生成对应的转换代码。它能够通过简单的注解配置来实现对象和Map之间的转换。

示例:

首先,定义一个转换接口:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.Map;@Mapper
public interface PersonMapper {PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);@Mapping(source = "name", target = "name")@Mapping(source = "age", target = "age")Map<String, Object> personToMap(Person person);
}

然后,在需要的地方使用该转换器:

Person person = new Person();
person.setName("Alice");
person.setAge(30);Map<String, Object> personMap = PersonMapper.INSTANCE.personToMap(person);
System.out.println(personMap);  // 输出:{name=Alice, age=30}

10. 使用Spring BeanUtils

Spring Framework的org.springframework.beans.BeanUtils类提供了一些静态方法,用于对象属性的拷贝和转换。

示例:

import org.springframework.beans.BeanUtils;
import java.util.HashMap;
import java.util.Map;// 使用示例
Person person = new Person();
person.setName("Alice");
person.setAge(30);// 对象转换为Map
Map<String, Object> personMap = new HashMap<>();
BeanUtils.copyProperties(person, personMap);
System.out.println(personMap);  // 输出:{name=Alice, age=30}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基于ESP32无线蓝牙上传电脑Excel透传数据】

【基于ESP32无线蓝牙上传电脑透传数据】 1. 引言2. 环境搭建2.1 硬件准备:2.2 软件准备:2.3. 配置Excel端口接收功能3. 测试代码4. 连接电脑和 ESP324.1 烧录程序4.2 启动蓝牙服务4.3 测试数据透传5. 总结1. 引言 随着物联网技术的发展,越来越多的设备开始支持无线通信,其…

fl studio2024官方体验版如何破解?

fl studio2024全称Fruity Loops Studio2024&#xff0c;这款软件也被人们亲切的称之为水果&#xff0c;它是一款功能强大的音乐创作编辑软件&#xff0c;拥有全功能的录音室&#xff0c;大混音盘以及先进的音乐制作工具&#xff0c;用户通过使用该软件&#xff0c;就可以轻松制…

轻量封装WebGPU渲染系统示例<43>- 材质组装流水线(MaterialPipeline)之灯光和阴影(源码)

目标: 数据化&#xff0c;模块化&#xff0c;自动化 备注: 从这个节点开始整体设计往系统规范的方向靠拢。之前的都算作是若干准备。所以会和之前的版本实现有些差异。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sa…

redis过期提醒

redis过期提醒 有一次看redis的配置文件发现一个notify-keyspace-events配置&#xff0c;注释里边长篇大论的&#xff0c;那我得看看这是干啥的&#xff0c;看完注释内容&#xff0c;发现不得了了&#xff0c;redis竟然还有过期提醒的功能 接下来得大家解释一下&#xff1a; 首…

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(2020)

文章目录 -Abstract1. Introductiondiss former methodour method 2. Related Work3. Compound Model Scaling3.1. 问题公式化3.2. Scaling Dimensions3.3. Compound Scaling 4. EfficientNet Architecture5. Experiments6. Discussion7. Conclusion 原文链接 源代码 - 本文中…

LeNet

概念 代码 model import torch.nn as nn import torch.nn.functional as Fclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__() # super()继承父类的构造函数self.conv1 nn.Conv2d(3, 16, 5)self.pool1 nn.MaxPool2d(2, 2)self.conv2 nn.Conv2d(16…

Bash脚本处理ogg、flac格式到mp3格式的批量转换

现在下载的许多音乐文件是flac和ogg格式的&#xff0c;QQ音乐上下载的就是这样的&#xff0c;这些文件尺寸比较大&#xff0c;在某些场合使用不便&#xff0c;比如在车机上播放还是mp3格式合适&#xff0c;音质这些在车机上播放足够了&#xff0c;要求不高。比如本人就喜欢下载…

软件接口安全设计规范

《软件项目接口安全设计规范》 1.token授权机制 2.https传输加密 3.接口调用防滥用 4.日志审计里监控 5.开发测试环境隔离&#xff0c;脱敏处理 6.数据库运维监控审计

卷王开启验证码后无法登陆问题解决

问题描述 使用 docker 部署&#xff0c;后台设置开启验证&#xff0c;重启服务器之后&#xff0c;docker重启&#xff0c;再次访问系统&#xff0c;验证码获取失败&#xff0c;导致无法进行验证&#xff0c;也就无法登陆系统。 如果不了解卷王的&#xff0c;可以去官网看下。…

飞天使-linux操作的一些技巧与知识点3

http工作原理 http1.0 协议 使用的是短连接&#xff0c;建立一次tcp连接&#xff0c;发起一次http的请求&#xff0c;结束&#xff0c;tcp断开 http1.1 协议使用的是长连接&#xff0c;建立一次tcp的连接&#xff0c;发起多次http的请求&#xff0c;结束&#xff0c;tcp断开ngi…

ky10 server x86 设置网卡开机自启

输入命令查看网卡名称 ip a 输入命令编辑网卡信息 vi /etc/sysconfig/network-scripts/*33改成yes 按ESC键&#xff0c;输入:wq&#xff0c;保存

Aloha 机械臂的学习记录2——AWE:AWE + ACT

继续下一个阶段&#xff1a; Train policy python act/imitate_episodes.py \ --task_name [TASK] \ --ckpt_dir data/outputs/act_ckpt/[TASK]_waypoint \ --policy_class ACT --kl_weight 10 --chunk_size 50 --hidden_dim 512 --batch_size 8 --dim_feedforward 3200 \ --n…

F : A DS二分查找_寻找比目标字母大的最小字母

Description 给你一个字符串str&#xff0c;字符串中的字母都已按照升序排序&#xff0c;且只包含小写字母。另外给出一个目标字母target&#xff0c;请你寻找在这一有序字符串里比目标字母大的最小字母。 在比较时&#xff0c;字母是依序循环出现的。例如&#xff0c;str“ab…

Python中锁的常见用法

在 Python 中&#xff0c;可以使用线程锁来控制多个线程对共享资源的访问。以下是一些常见的 Python 中锁的用法&#xff1a; 创建线程锁 在 Python 中&#xff0c;可以使用 threading 模块中的 Lock 类来创建线程锁。例如&#xff1a; import threading# 创建线程锁 lock …

Python网络爬虫环境的安装指南

网络爬虫是一种自动化的网页数据抓取技术&#xff0c;广泛用于数据挖掘、信息搜集和互联网研究等领域。Python作为一种强大的编程语言&#xff0c;拥有丰富的库支持网络爬虫的开发。本文将为你详细介绍如何在你的计算机上安装Python网络爬虫环境。 一、安装python开发环境 进…

什么是电压纹波,造成不良,如何测量、如何抑制设计

1 引言 电源给电子产品提供能量同时也附带了一些不好的影响成分,如纹波、噪声等,这些对本振、、滤波、放大器、混频器、检波、A/D 转换等电路都会产生影响,会直接影响电子产品正常工作,所以项目设计要合理、要有实测数据、要尽量减小系统电压的纹波。 1.1 电压纹波(volta…

bc-linux-欧拉重制root密码

最近需要重新安装虚拟机的系统 安装之后发现对方提供的root密码不对&#xff0c;无法进入系统。 上网搜了下发现可以进入单用户模式进行密码修改从而重置root用户密码。 在这个界面下按e键 找到图中部分&#xff0c;把标红的部分删除掉&#xff0c;然后写上rw init/bin/…

strftime(“%-m/%-d/%Y“) 报错 ValueError: Invalid format string

问题 运行测试用例时&#xff0c;出现ValueError: Invalid format string的错误&#xff0c;代码大致如下&#xff1a; from datetime import date .... current date.today() return current.strftime("%-m/%-d/%Y")原因 开发此代码的时候是在mac上开发的&#…

24、文件上传漏洞——Apache文件解析漏洞

文章目录 一、环境简介一、Apache与php三种结合方法二、Apache解析文件的方法三、Apache解析php的方法四、漏洞原理五、修复方法 一、环境简介 Apache文件解析漏洞与用户配置有密切关系。严格来说&#xff0c;属于用户配置问题&#xff0c;这里使用ubantu的docker来复现漏洞&am…

IOday7作业

1> 使用无名管道完成父子进程间的通信 #include<myhead.h>int main(int argc, const char *argv[]) {//创建存放两个文件描述符的数组int fd[2];int pid -1;//打开无名管道if(pipe(fd) -1){perror("pipe");return -1;}//创建子进程pid fork();if(pid &g…