摆脱冗杂赋值(一)——巧用序列化反序列化及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.mzph.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;与矮的右边界搭配结果如下。 与高的…