前言
随着开发的深入,记录了一些常用本人认为比较好的封装方法。
提示:以下是本篇文章正文内容,下面案例可供参考
一、集合对象序列化,反序列化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 字符串。