擺脫冗雜賦值(一)——巧用序列化反序列化及BeanUtils反射等工具解決開發時對象、集合、字符串等多種形式間相互轉換的方法及技巧

1、將Java對象轉換為JSON字符串

當我們需要將Java對象轉換為JSON字符串時,可以使用JSON.toJSONString()方法。下面是一個簡單的例子,展示如何使用JSON.toJSONString()將一個Java對象轉換為JSON字符串:

import com.alibaba.fastjson.JSON;public class Main {public static void main(String[] args) {Person person = new Person();person.setName("John Doe");person.setAge(30);String jsonString = JSON.toJSONString(person);System.out.println(jsonString);}
}
@Data
class Person {private String name;private int age;
}

在這個例子中,我們定義了一個名為Person的Java類,并創建了一個Person對象。然后,我們使用JSON.toJSONString()方法將這個對象轉換為JSON字符串,并打印輸出。

運行上述代碼,將會得到以下輸出:

{"name":"John Doe","age":30}

2、將JSON字符串解析為指定類型的Java對象

JSON.parseObject()方法是JSON類中的一個靜態方法,用于將JSON字符串解析為指定類型的Java對象。下面是一個簡單的例子,展示如何使用JSON.parseObject()方法將JSON字符串轉換為Java對象:

import com.alibaba.fastjson.JSON;public class Main {public static void main(String[] args) {String jsonString = "{\"name\":\"John Doe\",\"age\":30}";Person person = JSON.parseObject(jsonString, Person.class);System.out.println(person.getName());System.out.println(person.getAge());}
}@Data
class Person {private String name;private int age;
}

在這個例子中,我們定義了一個名為Person的Java類,并創建了一個包含JSON字符串的變量jsonString。然后,我們使用JSON.parseObject()方法將這個JSON字符串解析為Person類型的Java對象,并打印輸出該對象的屬性值。

運行上述代碼,將會得到以下輸出:

John Doe
30

3、集合間的轉換

集合轉換為另一個集合可以使用JSON.parseArray()方法。以下是示例代碼:

import com.alibaba.fastjson.JSON;public class Main {public static void main(String[] args) {List<Person> persons = new ArrayList<>();persons.add(new Person("John", 30));persons.add(new Person("Doe", 28));List<Student> students = JSON.parseArray(JSON.toJSONString(persons), Student.class);System.out.println(JSON.toJSONString(students));}
}
@Data
class Person {private String name;private int age;Person(String name, int age) {this.name = name;this.age = age;}
}@Data
class Student {private String name;private int age;
}

在這個例子中,我們首先創建了一個包含兩個Person對象的List。然后,我們使用JSON.parseArray()方法將這個集合解析為Student集合,并打印輸出該學生List。

運行上述代碼,將會得到以下輸出:

[{"age":30,"name":"John"},{"age":28,"name":"Doe"}]

4、對象之間的復制轉換

讓我們來看一個使用BeanUtils.copyProperties()方法的例子。假設我們有兩個Java類PersonAddress,它們分別表示一個人的信息和地址信息。這兩個類之間有一些共同的屬性,如姓名和年齡。我們想要從一個Person對象復制這些共享屬性到一個新的Address對象上。

首先,導入org.springframework.beans.BeanUtils包。然后編寫如下代碼:

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class BeanUtilsExample {@Autowiredprivate Person person;@Autowiredprivate Address address;public void copySharedProperties() {BeanUtils.copyProperties(person, address);}
}

在這個例子中,我們定義了一個名為BeanUtilsExample的Spring組件,并在其中注入了兩個Java類PersonAddress的對象。然后,我們定義了一個名為copySharedProperties()的方法,該方法使用BeanUtils.copyProperties()方法來復制Person對象中的共享屬性到Address對象中。

請注意,為了使這個例子能夠正常工作,需要確保已經正確配置了Spring容器,并且已經正確注入了PersonAddress對象。

5、自定義類型轉換

基于一些基本方法,還可以自己定義一些新的轉換copy方法。
比如基于JSON.toJSONString()JSON.parseArray()可以實現一個更簡潔的新的集合類型轉換方法。convertBeanList()方法實現。這個方法接受一個List對象和一個目標類的泛型類型作為參數,并返回一個新的List對象,其中包含了原始List對象中所有元素的實例化版本,這些元素都是通過指定的目標類創建的。

以下是這個方法的示例代碼:

import com.alibaba.fastjson.JSON;public class ConversionUtil {public static <T> List<T> convertBeanList(List list, Class<T> aclass) {String jsonStr = JSON.toJSONString(list);List<T> convertedList = JSON.parseArray(jsonStr, aclass);return convertedList;}
}

在這個例子中,我們首先使用JSON.toJSONString()方法將原始List對象轉換為JSON字符串。然后,我們使用JSON.parseArray()方法將這個JSON字符串解析為新的List對象,并且確保其中的所有元素都是通過指定的目標類創建的。

請注意,為了使這個方法能夠正常工作,你需要確保已經正確導入了com.alibaba.fastjson.JSON包。

當然,還有很多其他的方法可以自定義實現對象的轉換,比如通過流等方法,在此不過多贅述。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38968.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HUAWEI MPLS 靜態配置和動態LDP配置

MPLS(Multi-Protocol Label Switching&#xff0c;多協議標簽交換技術)技術的出現&#xff0c;極大地推動了互聯網的發展和應用。例如&#xff1a;利用MPLS技術&#xff0c;可以有效而靈活地部署VPN(Virtual Private Network&#xff0c;虛擬專用網)&#xff0c;TE(Traffic Eng…

Rust 進階教程

Rust 進階教程 在基礎教程中&#xff0c;我們已經了解了Rust的基本語法和核心概念。本文將進一步探討Rust的進階特性和應用&#xff0c;包括泛型、閉包、迭代器、異步編程、宏和unsafe代碼等。 目錄 泛型閉包和迭代器 閉包迭代器 異步編程宏Unsafe代碼FFI&#xff08;外部函…

pdf怎么拆分成一頁一頁?4種拆分方法分享

在日常的辦公學習中&#xff0c;PDF文檔因其跨平臺、易閱讀、不易篡改等特性&#xff0c;成為我們工作和學習中不可或缺的一部分。然而&#xff0c;當我們需要對PDF進行編輯、打印或分享時&#xff0c;有時需要將整個PDF文檔拆分成一頁一頁的單獨文件。那么&#xff0c;如何高效…

深入理解Vue生命周期鉤子函數

深入理解Vue生命周期鉤子函數 Vue.js 是一款流行的前端框架&#xff0c;通過其強大的響應式數據綁定和組件化的開發方式&#xff0c;使得前端開發變得更加簡單和高效。在Vue應用中&#xff0c;每個組件都有其生命周期&#xff0c;這些生命周期鉤子函數允許開發者在不同階段執行…

2024 AIGC 技術創新應用研討會暨數字造型設計師高級研修班通知

尊敬的老師、領導您好! 為深入響應國家關于教育綜合改革的戰略部署&#xff0c;深化職業教育、高等教育改革&#xff0c;發揮企業主體重要作用&#xff0c;促進人才培養供給側和產業需求側結構要素全方位融合&#xff0c;充分把握人工智能創意式生成(AIGC)技術在教育領域的發展…

【ruoyi】docker 項目實戰

一、引言 介紹ruoyi(若依)框架 本項目使用若依前后臺分離框架 https://gitee.com/ranmaxli/basic-business-platform 解釋為什么選擇Docker進行項目開發 使用docker是因為方便數據遷移、部署、管理 二、Docker基礎知識 Docker基本概念 容器與虛擬機

初學Spring之 IOC 控制反轉

Spring 是一個輕量級的控制反轉&#xff08;IOC&#xff09;和面向切面編程&#xff08;AOP&#xff09;的框架 導入 jar 包&#xff1a;spring-webmvc、spring-jdbc <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc&l…

HTTPS數字證書驗證論述

1 概述 網絡請求方式通常分為兩種&#xff0c;分別是HTTP請求和HTTPS請求&#xff0c;其中HTTP的傳輸屬于明文傳輸&#xff0c;在傳輸的過程中容易被人截取并且偷窺其中的內容&#xff0c;而HTTPS是一種在HTTP的基礎上加了SSL/TLS層&#xff08;安全套接層&#xff09;的安全的…

解決expand-change第一次展開無數據顯示與實現

最近寫需求時用到了expand-change表格展開回調&#xff0c;但我發現第一次展開后并沒有展示任何數據&#xff0c;但我的返回值是存在的&#xff0c;當第二次展開時發現數據就有了。此原因是因為獲取數據的接口是異步的&#xff0c;導致Dom渲染不同步導致的&#xff0c;其實解決…

Ubuntu24.04 Isaacgym的安裝

教程1 教程2 教程3 1.下載壓縮包 link 2. 解壓 tar -xvf IsaacGym_Preview_4_Package.tar.gz核心教程在 isaacgym/docs/install.html下 3. 從源碼安裝 Ubuntu24.04還需首先進入虛擬環境 python -m venv myenv # 創建虛擬環境&#xff0c;已有可跳過 source myenv/bin/a…

Redis持久化詳解

【關閉文件、AOF 刷盤、釋放內存這三個任務都有各自的任務隊列】所以不是單線程 Redis有兩種持久化方案&#xff1a; RDB持久化 AOF持久化 基于Redis集群解決單機Redis存在的問題 【Redis是單進程的】 【也有人做分布式section】 【主從集群中多個從就是做負載均衡的】 …

如何在Java中實現函數式編程

如何在Java中實現函數式編程 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在Java中&#xff0c;函數式編程是一種編程范式&#xff0c;它將計算視為數學函數…

在Linux系統中查找并計數正在運行的ffmpeg進程數量

ps aux | grep "ffmpeg" | grep -v "grep" | wc -l 這條命令是一個組合命令&#xff0c;用于在Linux系統中查找并計數正在運行的ffmpeg進程數量&#xff0c;同時排除了搜索命令本身&#xff08;即grep "ffmpeg"&#xff09;的干擾。下面是對每個…

Java識別圖片中的二維碼

引入依賴 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.10</version> </dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacp…

while陳述

回圈是用來進行進行重復性的工作&#xff0c;典型的回圈會進行下列三項基本任務 1. 控制變數初始設定2. 回圈結束條件測試3. 調整控制變數的值 關鍵字 while構成C 中回圈的一種&#xff0c;常用于沒有確定重復次數的回圈&#xff0c;同時while后面接著小括弧為回圈結束的條件…

上位機第二彈

之前寫的代碼用上了 現在想想 &#xff0c;北向一側還挺難搞&#xff0c;設計很巧妙

Continual Test-Time Domain Adaptation--論文筆記

論文筆記 資料 1.代碼地址 https://github.com/qinenergy/cotta 2.論文地址 https://arxiv.org/abs/2203.13591 3.數據集地址 論文摘要的翻譯 TTA的目的是在不使用任何源數據的情況下&#xff0c;將源預先訓練的模型適應到目標域。現有的工作主要考慮目標域是靜態的情況…

python - 列表 / 元組 / 字符串

一.列表 由于pyhon的變量沒有數據類型&#xff0c;所以python是沒有數組的&#xff08;因為數組只能存放一種類型&#xff0c;要么全部存放整型&#xff0c;要么全部存放浮點型&#xff09;&#xff0c;只有列表list&#xff0c;所以整數&#xff0c;浮點數&#xff0c;字符串…

傳輸線阻抗匹配電阻端接的方式

電路為什么需要端接&#xff1f; 眾所周知&#xff0c;電路中如果阻抗不連續&#xff0c;就會造成信號的反射&#xff0c;引起上沖下沖、振鈴等信號失真&#xff0c;嚴重影響信號質量。所以在進行電路設計的時候阻抗匹配是很重要的考慮因素。 對我們的PCB走線進行阻抗控制已經…

雙指針系列第 8 篇:盛水最多的容器。幾句話講明白!

Leetcode 題目鏈接 思路 取首尾雙指針和水量如下所示&#xff0c;設高度函數為 h ( i ) h(i) h(i)&#xff0c;在下圖中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 觀察以 l l l 為左邊界所能構成的其他水量&#xff0c;與矮的右邊界搭配結果如下。 與高的…