泛型List转List对象(Json转换工具类)

上期讲解了Java多线程查表(封装方法 多表通用)https://blog.csdn.net/weixin_56567361/article/details/128021905

因为是通用方法 返回的结果值为泛型List<T>类型

在使用list时 需要转换为list对象

下面我将对比三种转换方法:

1 阿里巴巴fastJson方法 

2 JAVA反射方式转换

3 强转方式

直接上测试图

数据量约18w条
阿里巴巴fastJson方式转换: 726 ms
JAVA反射方式转换: 15 ms
强转方式: 16 ms


数据量多时JSON.toJSONString会很慢

java发射方式和强转方法比阿里巴巴fastJson方式快了40多倍

JAVA反射方式转换 未做类型校验 这样转换并不安全

List<T> mapList = (List<T>)jsonObject.get("list");

强转方式 最适合 首先判断obj是否是List类型,然后使用class.cast做类型转换

 JsonUtils

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.compress.utils.Lists;

import java.lang.reflect.Field;
import java.util.*;

/**
 * Json转换工具类
 *
 */
public class JsonUtils {

    public static List<Field> fields = null;

    /**
     * 泛型List转List对象
     * 比JSON.parseArray(JSON.toJSONString(),T.class)
     * 快40倍
     *
     * @param obj 转换参数
     * @param cla 实体类
     * @param <T> 泛型
     * @return
     */
    public static <T> List<T> toList(Object obj, Class<T> cla) {
        List<T> list = new ArrayList<T>();
        //判断参数是否为List类型
        if (obj instanceof List<?>) {
            for (Object o : (List<?>) obj) {
                //将父类对象强制转换为子类对象
                list.add(cla.cast(o));
            }
            return list;
        }
        return null;
    }

    /**
     * List对象转List<map>
     *
     * @param list
     * @return
     * @throws IllegalAccessException
     */
    public static List<Map<String, Object>> toMap(List<?> list) throws IllegalAccessException {
        List<Map<String, Object>> mapList = new ArrayList<>();
        for (Object o : list) {
            Map<String, Object> map = objToMap(o);
            mapList.add(map);
        }
        return mapList;
    }

    /**
     * 对象转map
     *
     * @param object
     * @return
     * @throws IllegalAccessException
     */
    public static Map<String, Object> objToMap(Object object) throws IllegalAccessException {
        Map<String, Object> map = new HashMap<>();
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            map.put(field.getName(), field.get(object));
        }
        return map;
    }

    /**
     * 反射方式拿到类的field集合
     */
    public static <T> void init(T vo) {
        Class<?> aClass = vo.getClass();
        fields = Lists.newArrayList();
        for (Class<?> i = aClass; i != Object.class; i = i.getSuperclass()) {
            Field[] declaredFields = i.getDeclaredFields();
            Collections.addAll(fields, declaredFields);
        }
    }

    /**
     * 反射方式  泛型List转为List对象
     *
     * @param vo
     * @param T
     * @param <T>
     * @return
     * @throws IllegalAccessException
     */
    public static <T> List<T> testReflection(List<?> vo, Class<T> T) throws IllegalAccessException {
        if (fields == null) {
            init(vo);
        }
        JSONObject jsonObject = new JSONObject();
        for (Field field : fields) {
            field.setAccessible(true);
            jsonObject.put(field.getName(), field.get(vo));
        }
        //未做类型校验 这样转换并不安全
        List<T> mapList = (List<T>)jsonObject.get("list");
        return mapList;
    }
}

 至此本篇文章就讲到这里啦

如果有什么写的不对的或问题 欢迎留言讨论~😋

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是将泛型list转换Java对象的示例代码: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.List; public class JsonUtil { /** * 将json字符串转换Java对象 * * @param jsonStr json字符串 * @param clazz Java对象的类 * @param <T> 泛型类型 * @return Java对象 */ public static <T> T jsonToObject(String jsonStr, Class<T> clazz) { return JSON.parseObject(jsonStr, clazz); } /** * 将json字符串转换泛型list * * @param jsonStr json字符串 * @param clazz Java对象的类 * @param <T> 泛型类型 * @return 泛型list */ public static <T> List<T> jsonToList(String jsonStr, Class<T> clazz) { JSONArray jsonArray = JSON.parseArray(jsonStr); return jsonArray.toJavaList(clazz); } /** * 将Java对象转换json字符串 * * @param obj Java对象 * @return json字符串 */ public static String objectToJson(Object obj) { return JSON.toJSONString(obj); } /** * 将泛型list转换json字符串 * * @param list 泛型list * @return json字符串 */ public static String listToJson(List<?> list) { return JSON.toJSONString(list); } /** * 将json字符串转换JSONObject对象 * * @param jsonStr json字符串 * @return JSONObject对象 */ public static JSONObject jsonToJsonObject(String jsonStr) { return JSON.parseObject(jsonStr); } /** * 将JSONObject对象转换Java对象 * * @param jsonObject JSONObject对象 * @param clazz Java对象的类 * @param <T> 泛型类型 * @return Java对象 */ public static <T> T jsonObjectToObject(JSONObject jsonObject, Class<T> clazz) { return jsonObject.toJavaObject(clazz); } /** * 将JSONObject对象转换泛型list * * @param jsonObject JSONObject对象 * @param clazz Java对象的类 * @param <T> 泛型类型 * @return 泛型list */ public static <T> List<T> jsonObjectToList(JSONObject jsonObject, Class<T> clazz) { JSONArray jsonArray = jsonObject.getJSONArray("list"); return jsonArray.toJavaList(clazz); } } ``` 假设我们有一个Java对象类`Person`,它有两个属性`name`和`age`,我们可以使用以下代码将泛型list转换Java对象: ```java String jsonStr = "[{\"name\":\"张三\",\"age\":18},{\"name\":\"李四\",\"age\":20}]"; List<Person> personList = JsonUtil.jsonToList(jsonStr, Person.class); ``` 其中,`jsonStr`是包含两个`Person`对象json字符串,`Person.class`是`Person`类的类对象。`JsonUtil.jsonToList(jsonStr, Person.class)`将json字符串转换泛型list,其中每个元素都是`Person`对象
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜の雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值