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.pswp.cn/news/211024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211024.shtml
英文地址,請注明出處:http://en.pswp.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…