【工具类】ModelMergeUtil 工具类说明

一、工具类概述

在编程中,经常需要对数据进行合并操作。所以我写了一个ModelMergeUtil 工具类用于将不同的对象或数据进行合并,以满足在特定场景下的数据整合需求。以下是工具类的使用说明

二、方法详解

(一)merge(String originJsonStr, String currentJsonStr, Class<T> clazz) 方法

这个方法接受两个 JSON 字符串和一个类类型作为参数。它首先将这两个 JSON 字符串转换为 Map 对象,然后进行数据合并,最后将合并后的 Map 转换为指定类型的对象并返回。

以下是针对这个方法的测试示例:

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

class ModelMergeUtilTest {

    @Test
    void testMergeWithJsonStringsAndClass() {
        String originJsonStr = "{\"name\":\"Alice\",\"age\":20}";
        String currentJsonStr = "{\"age\":25,\"city\":\"London\"}";
        ModelMergeUtil modelMergeUtil = new ModelMergeUtil();

        Person mergedPerson = modelMergeUtil.merge(originJsonStr, currentJsonStr, Person.class);

        assertEquals("Alice", mergedPerson.getName());
        assertEquals(25, mergedPerson.getAge());
        assertEquals("London", mergedPerson.getCity());
    }
}

class Person {
    private String name;
    private int age;
    private String city;

    // 省略 getter 和 setter 方法
}

(二)merge(T originObject, T currentObject, Class<T> clazz) 方法

该方法接受两个对象和一个类类型作为参数。它会将这两个对象转换为 JSON 字符串,然后执行与上述方法类似的合并操作。

对应的测试方法如下:

@Test
void testMergeWithObjectsAndClass() {
    Person originPerson = new Person();
    originPerson.setName("Bob");
    originPerson.setAge(30);

    Person currentPerson = new Person();
    currentPerson.setAge(35);
    currentPerson.setCity("New York");

    ModelMergeUtil modelMergeUtil = new ModelMergeUtil();

    Person mergedPerson = modelMergeUtil.merge(originPerson, currentPerson, Person.class);

    assertEquals("Bob", mergedPerson.getName());
    assertEquals(35, mergedPerson.getAge());
    assertEquals("New York", mergedPerson.getCity());
}

(三)merge(String originJsonStr, String currentJsonStr) 方法

此方法接受两个 JSON 字符串,将其转换为 Map 对象进行合并,最后再转换回 JSON 字符串返回。

测试代码如下:

@Test
void testMergeWithJsonStrings() {
    String originJsonStr = "{\"name\":\"Eve\",\"age\":22}";
    String currentJsonStr = "{\"age\":28,\"occupation\":\"Engineer\"}";
    ModelMergeUtil modelMergeUtil = new ModelMergeUtil();

    String mergedJson = modelMergeUtil.merge(originJsonStr, currentJsonStr);

    assertTrue(mergedJson.contains("name\":\"Eve\""));
    assertTrue(mergedJson.contains("age\":28"));
    assertTrue(mergedJson.contains("occupation\":\"Engineer\""));
}

(四)merge(Object originObject, Object currentObject) 方法

该方法能够处理对象类型的输入。如果输入是字符串,则直接调用相应的字符串版本的合并方法;否则,将对象转换为 JSON 字符串后进行合并。

测试示例:

@Test
void testMergeWithObjects() {
    Object originObject = "{\"fruit\":\"Apple\",\"quantity\":5}";
    Object currentObject = "{\"quantity\":10,\"color\":\"Red\"}";
    ModelMergeUtil modelMergeUtil = new ModelMergeUtil();

    String mergedJson = modelMergeUtil.merge(originObject, currentObject);

    assertTrue(mergedJson.contains("fruit\":\"Apple\""));
    assertTrue(mergedJson.contains("quantity\":10"));
    assertTrue(mergedJson.contains("color\":\"Red\""));
}

三、总结

ModelMergeUtil 工具类通过多种 merge 方法的实现,为我们提供了灵活且高效的数据合并解决方案,使得在处理对象和数据的合并操作时更加便捷和可靠。希望以上说明和测试示例能够帮助您更好地理解和使用 ModelMergeUtil 工具类。

ModelMergeUtil 工具类的依赖gson。

<dependency>
	<groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version>
</dependency>

ModelMergeUtil 工具类的完整代码如下:

package com.fhey.common.utils;

import com.ecwid.consul.json.GsonFactory;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ObjectUtils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @author: fhey
 * @create: 2021-02-22 13:53
 * @description: 对象合并工具类
 */
@Slf4j
public class ModelMergeUtil2 {
    /**
     * 将当前对象与原始对象比较,并将数据合并到原始对象中
     *
     * @param originJsonStr
     * @param currentJsonStr
     * @param clazz
     */
    public static <T> T merge(String originJsonStr, String currentJsonStr, Class<T> clazz) {
        String mergeStr = merge(originJsonStr, currentJsonStr);
        T object =  GsonFactory.getGson().fromJson(mergeStr, clazz);
        return object;
    }

    /**
     * 将当前对象与原始对象比较,并将数据合并到原始对象中
     *
     * @param originObject
     * @param currentObject
     * @param clazz
     */
    public static <T> T merge(T originObject, T currentObject, Class<T> clazz) {
        String mergeStr = merge(originObject, currentObject);
        T object = GsonFactory.getGson().fromJson(mergeStr, clazz);
        return object;
    }

    /**
     * 将当前对象与原始对象比较,并将数据合并到原始对象中
     *
     * @param originJsonStr
     * @param currentJsonStr
     */
    public static String merge(String originJsonStr, String currentJsonStr) {
        log.info("merge's origin ---> {}", originJsonStr);
        log.info("merge's current ---> {}", currentJsonStr);

        Gson gson = GsonFactory.getGson();
        Map<String, Object> originMap = StringUtils.isBlank(originJsonStr)
                ? new HashMap<>()
                : gson.fromJson(originJsonStr, Map.class);
        Map<String, Object> currentMap = StringUtils.isBlank(currentJsonStr)
                ? new HashMap<>()
                : gson.fromJson(currentJsonStr, Map.class);
        Map<String, Object> newMap = merge(originMap, currentMap);
        String merge = gson.toJson(newMap);
        log.info("merge's result ---> {}", merge);
        return merge;
    }

    /**
     * 将当前对象与原始对象比较,并将数据合并到原始对象中
     *
     * @param originObject
     * @param currentObject
     */
    public static String merge(Object originObject, Object currentObject) {
        if (originObject instanceof String && currentObject instanceof String) {
            return merge(originObject.toString(), currentObject.toString());
        }
        Gson gson = GsonFactory.getGson();
        String originJsonStr = ObjectUtils.isEmpty(originObject) ? StringUtils.EMPTY : gson.toJson(originObject);
        String currentJsonStr = ObjectUtils.isEmpty(currentObject) ? StringUtils.EMPTY : gson.toJson(currentObject);
        return merge(originJsonStr, currentJsonStr);
    }



    /**
     * 将当前Map与原始Map比较,并将数据统一存在原始Map中
     *
     * @param originMap
     * @param currentMap
     */
    private static Map<String, Object> merge(Map<String, Object> originMap, Map<String, Object> currentMap) {
        for (Iterator<Map.Entry<String, Object>> it = currentMap.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, Object> item = it.next();
            String key = item.getKey();
            Object newValue = item.getValue();
            if (originMap.containsKey(key)) {
                Object oldValue = originMap.get(key);
                if (!newValue.equals(oldValue)) {
                    originMap.put(key, newValue);
                }
            } else {
                originMap.put(key, newValue);
            }
        }
        return originMap;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/774786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第六篇——谋攻篇:上兵伐谋,不是说打仗要用计谋

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 战术层面的东西&#xff0c;即便战略对了&#xff0c;战术不对&#xff0…

公司管理系统

准备工作 上图mapper类型错了&#xff0c;不是class&#xff0c;是interface&#xff0c;修正过后的图片&#xff0c;如下所示 修正如下 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/webm spring.datasour…

CAN总线(上)

CAN总线&#xff08;Controller Area Network Bus&#xff09;控制器局域网总线 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线&#xff0c;广泛应用于汽车、嵌入式、工业控制等领域 CAN总线特征&#xff1a; 两根通信线&#xff08;…

关于ORACLE单例数据库中的logfile的切换、删除以及添加

一、有关logfile的状态解释 UNUSED&#xff1a; 尚未记录change的空白group&#xff08;一般会出现在loggroup刚刚被添加&#xff0c;或者刚刚使用了reset logs打开数据库&#xff0c;或者使用clear logfile后&#xff09; CURRENT: 当前正在被LGWR使用的gro…

产科管理系统 专科电子病历系统源码,前后端分离架构,多家医院产科广泛运用,系统稳定,功能齐全

产科管理系统 专科电子病历系统源码&#xff0c;前后端分离架构&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统&#xff0c;特别是产科信息管理系统&#xff08;Obstetrical Information Management System&#xff0c;简称OIMS&…

建智慧医院核心:智能导航系统的功能全析与实现效益

在数字化转型的浪潮中&#xff0c;智慧医院的建设是医疗行业数字化转型的关键步骤。随着医院规模的不断扩大和医疗设施的日益复杂&#xff0c;传统的静态不连续的导航方式已无法满足患者的需求。院内智能导航系统&#xff0c;作为医疗数字化转型的关键组成部分&#xff0c;正逐…

2024骨传导耳机品牌排行榜!盘点10款优质热门机型推荐!

骨传导耳机逐渐成为当下最受欢迎的热门机型&#xff0c;但随着耳机热度的增高&#xff0c;市面上一些不法商家仿佛看到了商机&#xff0c;纷纷投入骨传导耳机市场&#xff0c;这也导致骨传导耳机市场出现鱼龙混杂&#xff0c;劣质品牌横行的局面&#xff0c;纷纷有消费者反馈说…

android2024 gradle8 Processor和ksp两种编译时注解实现

android的编译时注解&#xff0c;老生常谈&#xff0c;外面的例子都是bindView&#xff0c;脑壳看疼了&#xff0c;自己学习和编写下。 而且现在已经进化到kotlin2.0了&#xff0c;google也逐渐放弃kapt&#xff0c;进入维护状态。所以要好好看看本贴。 参考我的工程&#xff1…

djangoGD高校信管专业就业信息管理系统-计算机毕业设计源码59343

djangoGD高校信管专业就业信息管理系统 摘 要 随着高校信管专业的快速发展&#xff0c;学生就业问题日益受到广泛关注。为了更好地服务学生&#xff0c;提高就业率&#xff0c;许多高校开始引入信息化手段来管理学生就业信息。然而&#xff0c;传统的就业信息管理方式存在很多问…

Linux关于文件的高级命令

tree命令 tree命令用于以树状图的形式显示目录结构。它可以帮助用户快速了解目录和文件的层次关系&#xff0c;非常适合用于浏览和理解大型文件系统的结构。 基础用法 显示当前目录的树状结构&#xff1a;tree 显示指定目录的树状结构&#xff1a;tree 指定目录路径 tree命…

【C++】 解决 C++ 语言报错:Segmentation Fault

文章目录 引言 段错误&#xff08;Segmentation Fault&#xff09;是 C 编程中常见且令人头疼的错误之一。段错误通常发生在程序试图访问未被允许的内存区域时&#xff0c;导致程序崩溃。本文将深入探讨段错误的产生原因、检测方法及其预防和解决方案&#xff0c;帮助开发者在…

昇思25天学习打卡营第5天 | 神经网络构建

1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&#xff0c;它由不同…

如何摆脱反爬虫机制?

在网站设计时&#xff0c;为了保证服务器的稳定运行&#xff0c;防止非法数据访问&#xff0c;通常会引入反爬虫机制。一般来说&#xff0c;网站的反爬虫机制包括以下几种&#xff1a; 1. CAPTCHA&#xff1a;网站可能会向用户显示CAPTCHA&#xff0c;要求他们在访问网站或执行…

Netty学习(Netty入门)

概述 Netty是什么 Netty的地位 Netty的优势 HelloWorld public class HelloClient {public static void main(String[] args) throws InterruptedException {// 1. 启动类new Bootstrap()// 2. 添加 EventLoop.group(new NioEventLoopGroup())// 3. 选择客户端 channel 实现.…

python绘制领域矩形

问题描述&#xff1a; 使用python书写代码实现以下功能&#xff1a;给定四个点的坐标&#xff0c;调用一个函数&#xff0c;可以使原来的四个点分别向四周上下左右移动15距离&#xff0c;分别记录下移动后的坐标&#xff0c;然后画出内侧矩形和外侧矩形 代码&#xff1a; im…

配置并调试后端程序(sql)

1.环境准备 安装VS Code和Node.js插件&#xff1a;确保你已经安装了VS Code和Node.js插件。创建launch.json文件&#xff1a;在你的项目中创建一个.vscode文件夹&#xff0c;并在其中创建launch.json文件。添加以下内容&#xff1a; {"version": "0.2.0"…

【C语言】五子棋(c语言实现)

这里写目录标题 最终效果菜单打印函数棋盘的初始化和打印人人对战落子判空函数悔棋函数判胜负函数人人对战 人机对战一是将直接调用rand生成随机值&#xff0c;这就不可控二是根据棋子赢面来判断哪里落子最好 如果选择退出程序直接exit就行主函数调用逻辑源代码 最终效果 五子棋…

The Sandbox 人物化身每月奖励: 七月版来了!

人物化身的持有者可以从 The Sandbox 领取自己的队服&#xff01; 视频&#xff1a;https://youtu.be/tSo5FPL7DhE 我们又推出了人物化身所有者月度奖励&#xff01;在七月&#xff0c;我们将通过 The Sandbox 队服来弘扬体育竞技精神。穿上这些时尚的元宇宙队服&#xff0c;代…

深度报告 | 百度安全携手极越安全发布《整车安全渗透测试白皮书》

注重点&#xff0c;如何确保车辆全生命周期的安全已成为整个行业亟待解决的问题。对于车企而言&#xff0c;通过渗透测试尽量多地发现安全威胁&#xff0c;是确保车辆信息系统的稳定运行、保障用户安全驾驶至关重要的措施。然而&#xff0c;传统的渗透测试方法已无法满足智能网…

Linux miniconda 安装tensorflow-gpu遇到找不到GPU问题

背景&#xff1a; Linux Miniconda python3.9 安装步骤 1、 pip install tensorflow-gpu2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 2、报错如下&#xff1a; 更换镜像源&#xff0c;单独安装 pip install tf-estimator-nightly2.8.0.dev2021122109 -i https:/…