117 lines
3.1 KiB
Java
117 lines
3.1 KiB
Java
package com.rzyc.provinceUtil;
|
||
|
||
|
||
import com.fasterxml.jackson.core.type.TypeReference;
|
||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||
import java.lang.reflect.ParameterizedType;
|
||
import java.lang.reflect.Type;
|
||
|
||
/**
|
||
* @author dong
|
||
* @date 2025-03-18 15:25
|
||
* @Version V1.0
|
||
*/
|
||
public class JsonUtils {
|
||
|
||
|
||
private static final ObjectMapper objectMapper = new ObjectMapper();
|
||
|
||
/**
|
||
* 将 JSON 字符串转换为包含泛型的对象
|
||
* @param json JSON 字符串
|
||
* @param mainClass 主类型(如 Result.class)
|
||
* @param subClass 泛型参数类型(如 User.class)
|
||
* @return 转换后的对象
|
||
*/
|
||
public static <T, R> T fromJson(String json, Class<T> mainClass, Class<R> subClass) {
|
||
try {
|
||
// 动态构建泛型类型(例如 Result<User>)
|
||
Type type = createParametricType(mainClass, subClass);
|
||
return objectMapper.readValue(json, new TypeReference<T>() {
|
||
@Override
|
||
public Type getType() {
|
||
return type;
|
||
}
|
||
});
|
||
} catch (Exception e) {
|
||
throw new RuntimeException("JSON 转换失败", e);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
/**
|
||
* 构建 ParameterizedType(例如 Result<User>)
|
||
*/
|
||
private static ParameterizedType createParametricType(final Class<?> rawType,
|
||
final Type... typeArguments){
|
||
return new ParameterizedType() {
|
||
@Override
|
||
public Type[] getActualTypeArguments() {
|
||
return typeArguments;
|
||
}
|
||
|
||
@Override
|
||
public Type getRawType() {
|
||
return rawType;
|
||
}
|
||
|
||
@Override
|
||
public Type getOwnerType() {
|
||
return null;
|
||
}
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 使用示例:解析 Result<List<User>>
|
||
* @version v1.0
|
||
* @author dong
|
||
* @date 2025/3/18 15:44
|
||
*/
|
||
/* Type userListType = new TypeToken<List<User>>() {}.getType();
|
||
Result<List<User>> result = JsonUtils.fromJsonComplex(
|
||
json,
|
||
Result.class,
|
||
userListType
|
||
);*/
|
||
|
||
/**
|
||
* json转list
|
||
* @version v1.0
|
||
* @author dong
|
||
* @date 2025/3/18 15:43
|
||
*/
|
||
public static <T> T fromJsonComplex(String json, Class<?> rawType, Type... genericTypes) {
|
||
try {
|
||
ParameterizedType type = new ParameterizedType() {
|
||
@Override
|
||
public Type[] getActualTypeArguments() {
|
||
return genericTypes;
|
||
}
|
||
|
||
@Override
|
||
public Type getRawType() {
|
||
return rawType;
|
||
}
|
||
|
||
@Override
|
||
public Type getOwnerType() {
|
||
return null;
|
||
}
|
||
};
|
||
return objectMapper.readValue(json, new TypeReference<T>() {
|
||
@Override
|
||
public Type getType() {
|
||
return type;
|
||
}
|
||
});
|
||
} catch (Exception e) {
|
||
throw new RuntimeException("JSON 转换失败", e);
|
||
}
|
||
}
|
||
|
||
|
||
}
|