java好用的封装方法(集合对象序列化json反序列化json,公共数据收集工具)

在这里插入图片描述


前言

随着开发的深入,记录了一些常用本人认为比较好的封装方法。


提示:以下是本篇文章正文内容,下面案例可供参考

一、集合对象序列化,反序列化utils

package wnoa.base.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.List;

public class JsonUtilsCmms {

    private static final ObjectMapper mapper = new ObjectMapper();
	/**引入依赖
	*<dependency>
	*    <groupId>com.fasterxml.jackson.core</groupId>
	*    <artifactId>jackson-databind</artifactId>
	*    <version>2.13.0</version> <!-- 替换成当前最新版本 -->
	*</dependency>
	*/
    /**
     * 将对象集合转换为 JSON 字符串。
     *
     * @param collection 要转换的对象集合
     * @param <T>        集合中对象的类型
     * @return JSON 字符串表示
     * @throws JsonProcessingException 如果转换过程中发生错误
     */
    public static <T> String serializeListToJson(List<T> collection) throws JsonProcessingException {
        return mapper.writeValueAsString(collection);
    }

    /**
     * 将 JSON 字符串转换为指定类型的对象集合。
     *
     * @param jsonString     JSON 字符串
     * @param collectionType 集合的类型(例如,new TypeReference<List<YourObjectType>>() {})
     * @param <T>            集合中对象的类型
     * @return 对象集合
     * @throws IOException 如果解析过程中发生错误
     */
    public static <T> List<T> deserializeJsonToList(String jsonString, TypeReference<List<T>> collectionType) throws IOException {
        return mapper.readValue(jsonString, collectionType);
    }

    /**
     * 将 JSON 字符串反序列化为指定类型的对象。
     *
     * @param json  JSON 字符串
     * @param clazz 目标对象的类
     * @param <T>   目标对象的类型
     * @return 反序列化后的对象
     * @throws IOException 如果解析过程中发生错误
     */
    public static <T> T jsonToObject(String json, Class<T> clazz) throws IOException {
     //忽略未知字段
   	  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return mapper.readValue(json, clazz);
    }

    /**
     * 将对象转换为 JSON 字符串。
     *
     * @param object 要转换的对象
     * @return JSON 字符串表示
     * @throws JsonProcessingException 如果转换过程中发生错误
     */
    public static String objectToJson(Object object) throws JsonProcessingException {
        return mapper.writeValueAsString(object);
    }
}

主要功能和作用

1. 导入依赖:

  • 使用了 Jackson 库,这是一个流行的 Java 序列化/反序列化库,用于处理 JSON 数据。

2. 类和字段:

  • JsonUtilsCmms 类包含了一个私有的静态 ObjectMapper 对象 mapper,用于实现 JSON 与 Java 对象之间的转换。

3. 静态方法 serializeListToJson:

  • 功能:将给定的对象集合(List)转换为对应的 JSON 字符串。
  • 参数:
    collection:要转换的对象集合,类型为 List。
  • 返回值:返回转换后的 JSON 字符串表示。
  • 异常处理:可能会抛出 JsonProcessingException,表示在序列化过程中可能会出现的异常。

4. 静态方法 deserializeJsonToList:

  • 功能:将给定的 JSON 字符串转换为指定类型的对象集合。
  • 参数:
    jsonString:要解析的 JSON 字符串。
    collectionType:指定要解析成的集合类型,例如 new TypeReference<List>() {}。
  • 返回值:返回解析后的对象集合,类型为 List。
  • 异常处理:可能会抛出 IOException,表示在反序列化过程中可能会出现的异常。

调用示例

使用该类可以简化在 Java 中处理对象与 JSON 数据之间转换的操作,特别是当需要处理复杂的对象结构或大量数据时,能够提高开发效率和代码的可读性。

示例代码中展示了如何使用这两个方法来序列化和反序列化 List 对象,将 Java 对象转换为 JSON 字符串并反之亦然。

//实体类
import java.io.IOException;
import java.util.List;

public class Person {
    private String name;
    private int age;
}
//调用示例类
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import wnoa.base.util.JsonUtilsCmms;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class JsonSerializationExample {

    public static void main(String[] args) {
        try {
            // 创建一个 Person 对象列表
            List<Person> personList = new ArrayList<>();
            personList.add(new Person("Alice", 25));
            personList.add(new Person("Bob", 30));

            // 将对象列表转换为 JSON 字符串
            String json = JsonUtilsCmms.serializeListToJson(personList);
            System.out.println("Serialized JSON:");
            System.out.println(json);

            // 将 JSON 字符串转换回对象列表
            List<Person> deserializedList = JsonUtilsCmms.deserializeJsonToList(json, new TypeReference<List<Person>>() {});
            System.out.println("\nDeserialized Objects:");
            for (Person person : deserializedList) {
                System.out.println(person);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

二、数据按规格型号ID收集工具

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CollectionUtils {

    /**
     * 将相同规格型号的数据收集到一起
     * @param manyLists 要处理的数据列表
     * @param keyExtractor 规格型号id的提取函数
     * @param <T> 数据类型
     * @return 收集后的Map,键是规格型号id,值是对应的数据列表
     */
    public static <T> Map<String, List<T>> collectBySpecificationsId(List<T> manyLists, KeyExtractor<T> keyExtractor) {
        Map<String, List<T>> manyListsMap = new HashMap<>();

        for (T manyList : manyLists) {
            String commoditySpecificationsId = keyExtractor.extractKey(manyList); // 提取规格型号id
            List<T> list = manyListsMap.computeIfAbsent(commoditySpecificationsId, k -> new ArrayList<>());
            list.add(manyList);
        }

        return manyListsMap;
    }

    /**
     * 提取规格型号id的接口
     * @param <T> 数据类型
     */
    public interface KeyExtractor<T> {
        String extractKey(T item);
    }

    // 示例用法
    public static void main(String[] args) {
        List<WnManyPurchasingProductInformationInfoVO> manyLists = new ArrayList<>(); // 假设这里有数据

        // 使用 Lambda 表达式实现 KeyExtractor 接口
        Map<String, List<WnManyPurchasingProductInformationInfoVO>> manyListsMap =
                collectBySpecificationsId(manyLists, WnManyPurchasingProductInformationInfoVO::getCommoditySpecificationsId);

        // 使用匿名类实现 KeyExtractor 接口
        Map<String, List<WnManyPurchasingProductInformationInfoVO>> manyListsMap2 =
                collectBySpecificationsId(manyLists, new KeyExtractor<WnManyPurchasingProductInformationInfoVO>() {
                    @Override
                    public String extractKey(WnManyPurchasingProductInformationInfoVO item) {
                        return item.getCommoditySpecificationsId();
                    }
                });

        // 其他操作使用 manyListsMap 或 manyListsMap2
    }
}

主要功能和作用

collectBySpecificationsId 方法:

这是一个静态方法,用于接收一个列表 manyLists 和一个 KeyExtractor,并返回一个 Map<String, List>。
KeyExtractor 是一个接口,用于从每个数据项中提取规格型号id。
在方法内部,使用了 computeIfAbsent 方法来确保在 Map 中获取到对应规格型号id的列表,如果不存在则创建一个新列表。
KeyExtractor 接口:

这是一个函数式接口,用于提取数据项中的规格型号id。可以通过 Lambda 表达式或匿名类实现这个接口,具体取决于使用情况。

调用示例

在 main 方法中展示了如何使用 collectBySpecificationsId 方法来收集 WnManyPurchasingProductInformationInfoVO 类型的数据。可以根据实际情况,通过不同的 KeyExtractor 实现来提取不同的键值。
通过这种封装,可以使得代码更加模块化和可复用,便于在项目中多个地方使用相同的数据收集逻辑。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CollectionUtils {

    /**
     * 将相同规格型号的数据收集到一起
     * @param manyLists 要处理的数据列表
     * @param keyExtractor 规格型号id的提取函数
     * @param <T> 数据类型
     * @return 收集后的Map,键是规格型号id,值是对应的数据列表
     */
    public static <T> Map<String, List<T>> collectBySpecificationsId(List<T> manyLists, KeyExtractor<T> keyExtractor) {
        Map<String, List<T>> manyListsMap = new HashMap<>();

        for (T manyList : manyLists) {
            String commoditySpecificationsId = keyExtractor.extractKey(manyList); // 提取规格型号id
            List<T> list = manyListsMap.computeIfAbsent(commoditySpecificationsId, k -> new ArrayList<>());
            list.add(manyList);
        }

        return manyListsMap;
    }

    /**
     * 提取规格型号id的接口
     * @param <T> 数据类型
     */
    public interface KeyExtractor<T> {
        String extractKey(T item);
    }

    // 示例用法
    public static void main(String[] args) {
        List<WnManyPurchasingProductInformationInfoVO> manyLists = new ArrayList<>(); // 假设这里有数据

        // 使用 Lambda 表达式实现 KeyExtractor 接口
        Map<String, List<WnManyPurchasingProductInformationInfoVO>> manyListsMap =
                collectBySpecificationsId(manyLists, WnManyPurchasingProductInformationInfoVO::getCommoditySpecificationsId);

        // 使用匿名类实现 KeyExtractor 接口
        Map<String, List<WnManyPurchasingProductInformationInfoVO>> manyListsMap2 =
                collectBySpecificationsId(manyLists, new KeyExtractor<WnManyPurchasingProductInformationInfoVO>() {
                    @Override
                    public String extractKey(WnManyPurchasingProductInformationInfoVO item) {
                        return item.getCommoditySpecificationsId();
                    }
                });

        // 其他操作使用 manyListsMap 或 manyListsMap2
    }
}

总结

持续更新---------------
2024/7/25 更新
现在,JsonUtilsCmms 类中包含了四个静态方法:
serializeListToJson: 将对象集合转换为 JSON 字符串。
deserializeJsonToList: 将 JSON 字符串转换为指定类型的对象集合。
jsonToObject: 将 JSON 字符串反序列化为指定类型的对象。
objectToJson: 将对象转换为 JSON 字符串。

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSON序列化反序列化是用于存储和交换文本信息的一种方式,通过将对象转换为JSON字符串来实现序列化,而将JSON字符串转换为对象来实现反序列化。 在C#或.NET中,可以使用JSON库来进行序列化反序列化操作。这样可以方便地将实体对象转换为JSON字符串,以及将JSON字符串转换为视图或对象。 对于序列化,可以使用JSON.stringify()方法将实体对象转换为JSON格式的字符串。这个方法将会将对象的属性和值转换成相应的JSON格式。 对于反序列化,有两种常见的方式。一种是使用JSON对象内置的parse()函数,它可以将JSON字符串转换为JSON对象。另一种方式是使用eval()函数,它可以执行JSON字符串,返回对应的JavaScript对象。 总结来说,JSON序列化反序列化提供了一种方便的方式来处理对象JSON之间的转换,可以用于与第三方系统做接口。在C#或.NET中,可以使用JSON库来实现这些操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#或.net json序列化反序列化,适用于与第三方系统做接口用](https://download.csdn.net/download/Man_508/12454543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [基于Json序列化反序列化通用的封装完整代码](https://download.csdn.net/download/weixin_38630358/12777084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [JavaScript JSON序列化反序列化](https://blog.csdn.net/qq_14876133/article/details/128728764)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值