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);
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM