java 两个对象copy,并移除或添加一些属性
前言
目前遇到了 后端查到的数据和我想给前端返回的数据 不太一致的困惑。
因为不想因为返回给前端少一个字段,我这边就用不成了select *。
所以听了@朱杰 大佬的建议,这样搞。
其实这样我也不满意 因为为此还建立了个vo类,但是没办法,java是面向对象的,不想我们js那么随意
方法1
List<Article> list = articleService.list(); // 原始数据Article类型
List<ArticleVO> articleVOS = new ArrayList<>(); // 需要创建ArticleVO类型
for (Article article : list) {
ArticleVO articleVO = new ArticleVO();
// 利用这个方法进行 两个类型匹配 copy操作
BeanUtils.copyProperties(article,articleVO);
articleVOS.add(articleVO);
}
当然也可以这样,不过这个真的蠢得不能再蠢了
List<Article> list = articleService.list(); // 原始数据Article类型
List<ArticleVO> articleVOS = new ArrayList<>(); // 需要创建ArticleVO类型
for (Article article : list) {
article.setContent(null);
}
方法2
使用封装的工具类,方便其它地方使用
List<Article> list = articleService.list();
List<ArticleVO> articleVOS = JsonUtils.json2Object(JsonUtils.object2Json(list),List.class);
JsonUtils工具类代码如下:
package com.dshvv.blogserver.utils;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.MapLikeType;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author xxx
* @version 1.0.0
* @date 2022/08/06 11:47
* @since 1.0.0
*/
public class JsonUtils {
private static final ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
//序列化时候统一日期格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//设置null时候不序列化(只针对对象属性)
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//反序列化时,属性不存在的兼容处理
objectMapper.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 设置此属性,表示序列化字段是,如果有字段匹配失败,不会抛出异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//单引号处理
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, Boolean.TRUE);
objectMapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
/**
* 解决
* com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
* 错误
*/
objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
}
private JsonUtils() {
}
public static List<Object> json2List(String jsonStr) {
JavaType javaType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, Object.class);
try {
return objectMapper.readValue(jsonStr, javaType);
} catch (IOException ex) {
}
return Collections.emptyList();
}
public static Map<String, Object> json2Map(String jsonStr) {
MapLikeType mapLikeType = objectMapper.getTypeFactory().constructMapLikeType(HashMap.class, String.class, Object.class);
try {
return objectMapper.readValue(jsonStr, mapLikeType);
} catch (IOException ex) {
}
return new HashMap<>();
}
public static <T> T json2Object(String json, Class<T> clazz) {
try {
return objectMapper.readValue(json, clazz);
} catch (JsonProcessingException ex) {
}
return null;
}
public static <T> T json2Object(String json, TypeReference<T> type) {
try {
return objectMapper.readValue(json, type);
} catch (JsonProcessingException ex) {
}
return null;
}
public static <T> String object2Json(T entity) {
try {
return objectMapper.writeValueAsString(entity);
} catch (JsonGenerationException ex) {
} catch (JsonMappingException ex) {
} catch (IOException ex) {
}
return null;
}
public static <T> List<T> parseArray(String jsonString, Class<T> type) {
try {
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, type);
return objectMapper.readValue(jsonString, javaType);
} catch (IOException ex) {
throw new IllegalArgumentException("parse json fail:" + jsonString, ex);
}
}
}
java 两个对象copy,并移除或添加一些属性的更多相关文章
- java两个对象属性比较
两个对象进行比较相等,有两种做法: 1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可.这里就不用说明 2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用 ...
- JAVA 两个对象不同为什么他们的hashcode有可能相同
hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了.如果重载了的话,由于采 ...
- java 两个对象共使一个方法
- Java操作Sqoop对象
Windows下使用Eclipse工具操作Sqoop1.4.6对象 Sqoop是用来在关系型数据库与Hadoop之间进行数据的导入导出,Windows下使用Eclipse工具操作时,需要先搭建好Had ...
- 对象copy的两种方式--序列化--clone
对象实现copy有多中方式,最土的方法就是直接new,然后塞值,不过这种方法是真的low,下面着重说说Object类中的clone() 和 序列化反序列化copy Object 中 clone的方法 ...
- 【java编程】java对象copy
实现java对象Copy的三种方式 一.克隆 implements Cloneable 二.序列化 implements Serializable 三.利用反射机制copy apache的BeanUt ...
- java比较两个对象是否相等的方法
java比较两个对象是否相等直接使用equals方法进行判断肯定是不会相同的. 例如: Person person1 =new Person("张三"); Person pe ...
- 判断java中两个对象是否相等
java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...
- java中两个对象间的属性值复制,比较,转为map方法实现
package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...
- Java 判断两个对象是否相等
一.使用 == 与 equals == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() ...
随机推荐
- volatile修饰全局变量,可以保证线程并发安全吗?
今天被人问到volatile能不能保证并发安全? 呵,这能难倒我? 直接上代码: public class ThreadTest { // 使用volatile修饰变量 private static ...
- Rocketmq 如何处理消息积压 ?
一.消息积压发现 1.Console入口 A.延迟数量(Delay) 消息积压数量,即当前Topic还剩下多少消息未处理,该值越大,表示积压的消息越多 B.最后消费时间(LastConsumeTime ...
- 🎀spring @conditional介绍及使用
简介 @Conditional 是 Spring 框架中用于条件化注册 Bean的核心注解,它允许开发者根据特定条件决定是否将某个Bean注册到 Spring 容器中.这一机制在实现多环境配置.模块化 ...
- php-ffmpeg保存为.mp4格式时报错
原文: php-ffmpeg保存为.mp4格式时报错:FFMpeg\Exception\RuntimeException: Encoding failed in - 搜栈网 (seekstack.c ...
- Golang 版本导致的容器运行时问题
问题现场 用户反馈安装了某个 containerd 版本的节点无法正常拉起容器,业务场景是在 K8S Pod 里面运行一个 Docker,在容器里面通过 docker 命令再启动新的容器. 报错信息如 ...
- C#高性能开发之类型系统:从C# 7.0 到C# 14的类型系统演进全景
自C# 7.0以来,C#语言在类型系统方面引入了众多新数据类型.类型构造和语言特性,以提升性能.类型安全性和开发效率.本文全面整理了从C# 7.0到C# 14.0(截至2025年4月,C# 14.0为 ...
- Asp.net core 少走弯路系列教程(四)JavaScript 学习
前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...
- wget--批量下载
wget--批量下载 wget -nd -r -l1 --no-parent --accept=jar http://192.168.38.38:81/js/jartest/ -nd 不创建目录, w ...
- 【记录】Samba|Windows 11的Samba连接切换用户
Samba是一个用于共享文件和打印机的网络协议,可以使不同的操作系统之间共享文件和资源变得容易.在Windows 11上,可以使用Samba来连接到网络共享. 如果您想在Windows 11上切换用户 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit (3)
1.问题描述: 通过CardRecognition识别身份证拍照拿到的照片地址,使用该方法获取不到图片文件,请问如何解决? 解决方案: //卡证识别实现页,文件名为CardDemoPage,需被引入至 ...