前言

目前遇到了 后端查到的数据和我想给前端返回的数据 不太一致的困惑。

因为不想因为返回给前端少一个字段,我这边就用不成了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,并移除或添加一些属性的更多相关文章

  1. java两个对象属性比较

    两个对象进行比较相等,有两种做法: 1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可.这里就不用说明 2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用 ...

  2. JAVA 两个对象不同为什么他们的hashcode有可能相同

    hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了.如果重载了的话,由于采 ...

  3. java 两个对象共使一个方法

  4. Java操作Sqoop对象

    Windows下使用Eclipse工具操作Sqoop1.4.6对象 Sqoop是用来在关系型数据库与Hadoop之间进行数据的导入导出,Windows下使用Eclipse工具操作时,需要先搭建好Had ...

  5. 对象copy的两种方式--序列化--clone

    对象实现copy有多中方式,最土的方法就是直接new,然后塞值,不过这种方法是真的low,下面着重说说Object类中的clone() 和 序列化反序列化copy Object 中 clone的方法 ...

  6. 【java编程】java对象copy

    实现java对象Copy的三种方式 一.克隆 implements Cloneable 二.序列化 implements Serializable 三.利用反射机制copy apache的BeanUt ...

  7. java比较两个对象是否相等的方法

    java比较两个对象是否相等直接使用equals方法进行判断肯定是不会相同的. 例如: Person  person1  =new Person("张三"); Person  pe ...

  8. 判断java中两个对象是否相等

    java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...

  9. java中两个对象间的属性值复制,比较,转为map方法实现

    package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...

  10. Java 判断两个对象是否相等

    一.使用 == 与 equals == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() ...

随机推荐

  1. dijkstra的封装模版

    /** - swj - * />_____フ | _ _| /`ミ _x ノ / | / ヽ ? / ̄| | | | | ( ̄ヽ__ヽ_)_) \二つ **/ #include <bits ...

  2. STM8S003驱动TM1650偶发性故障

    故障现象:STM8S003驱动TM1650数码管显示,偶发TM1650无法初始化造成数码管点不亮. 已经在程序中对TM1650初始化之前加上了延时,但是问题并未改善. 之前发生过类似情况,STM8S0 ...

  3. 题解:P10862 [HBCPC2024] Spicy or Grilled?

    题目翻译: 有 nnn 个人,我们为他们买了香辣鸡肉汉堡套餐,每份是 aaa 元,可是里面有 xxx 人不能吃辣,于是还准备了 xxx 份烤鸡汉堡套餐,每份是 bbb 元,求总共要多少元. 解题思路 ...

  4. OAuth 2.0——微信授权登录

    一.参考链接: 理解OAuth 2.0 - 阮一峰的网络日志 (ruanyifeng.com) 使用微信授权登录: 参照:第三方平台使用微信登录流程 - 知乎 (zhihu.com) 基本概念介绍 | ...

  5. GitLab CI/CD 的配置文件 .gitlab-ci.yml 简介

    〇.前言 .gitlab-ci.yml 文件主要用于项目的自动化部署配置,自动化可以大大提升团队效率,但同时这个文件的内容也比较复杂,弄清楚也并非易事,本文将对此文件的内容进行简单介绍,供参考. 另外 ...

  6. 40.8K star!让AI帮你读懂整个互联网:Crawl4AI开源爬虫工具深度解析

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Crawl4AI 是2025年GitHub上最受瞩目的开源网络爬虫工具,专为AI时代设计.它 ...

  7. gfast工作流2.0发布

    Gfast 是基于 GF (Go Frame) 的后台管理系统,此次为丰富 Gfast 生态而增加工作流,经过长时间的精心研发和严格测试,全新 Gfast 工作流版本现已正式发布! 流程亮点: 1.支 ...

  8. Sentinel——熔断规则

    目录 熔断规则 慢调用比例 慢比例调用代码实现 自定义异常处理器(返回响应流) 自定义异常处理类 测试 自定义异常处理器(返回页面) 异常处理器 定义页面 测试 熔断规则 现代微服务架构都是分布式的, ...

  9. HarmonyOS NEXT开发实战教程-记账app

    今天分享的实战教程是一款记账app,最近分享的项目都是纯页面,没有服务端,没有数据接口,因为鸿蒙开发主要就是写页面,都是前端嘛.如果有友友想要完整的项目可以找幽蓝君定制,想学服务端开发的话幽蓝君也可以 ...

  10. Ubuntu下好用的工具

    UML画图工具 推荐:Drawio 参考:https://blog.csdn.net/jsm1010/article/details/112920539 安装命令:sudo snap install ...