java BeanMap和JSON对象相互转换 对比

BeanMap和JSON对象相互转换 对比

目录

BeanMap和JSON对象相互转换 对比

0,数据准备:

Shape 单个对象

List数据 ShapeFactory

ListMaps数据

BeanMapUtis代码:

1,对比Bean对象转换为List的情况

测试:

将size改为: 1500000

将size改为: 2000000

分析:

2,对比 将List转换为Bean对象

测试:

size: 1500000

size: 2000000

分析:

总结


 可以使用fastjson的JSON,进行Bean对象和Map相互转换,也可以用BeanMap的方式进行进行Bean对象和Map相互转换,两种之间的效率如何呢? 该如何选择?

 

0,数据准备:

Shape 单个对象

public class Shape implements Cloneable {
    private String color;
    private String type;

    public Shape() {
    }
    
    public Shape(String color, String type) {
        this.color = color;
        this.type = type;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    @Override
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
    @Override
    public String toString() {
        return "Shape{" +
                "color='" + color + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

 

List<Shape>数据 ShapeFactory

public class ShapeFactory {
    private static final String COLORS[] =
            { "红色", "粉红色", "绿色", "蓝色", "棕色", "橘色" };
    private static final String SHAPES[] =
            { "圆形", "三角形", "长方形", "平行四边形", "扇形", "梯形" };
    public static List<Shape> create(int size) {
        List<Shape> shapeList = new ArrayList<>();
        // 先造一个原型
        Shape prototypeShape = new Shape(getRandomColor(), getRandomShape());
        for(int i=0; i < size; ++i) {
            Shape clone = (Shape) prototypeShape.clone();//复制原型
            clone.setColor(getRandomColor());
            clone.setType(getRandomShape());
            shapeList.add(clone);
        }
        return shapeList;
    }
    private static String getRandomColor() {
        return COLORS[(int)(Math.random()*COLORS.length)];
    }
    private static String getRandomShape() {
        return SHAPES[(int)(Math.random()*COLORS.length)];
    }
}

 

ListMaps数据

public class ShapeListMapFactory {
    private static final String COLORS[] =
            { "红色", "粉红色", "绿色", "蓝色", "棕色", "橘色" };
    private static final String SHAPES[] =
            { "圆形", "三角形", "长方形", "平行四边形", "扇形", "梯形" };
    public static List<Map<String,Object>> create(int size) {
        List<Map<String,Object>> shapeList = new ArrayList<>();
        for(int i=0; i < size; ++i) {
            Map<String,Object> single = new HashMap<>();
            single.put("color", getRandomColor());
            single.put("type", getRandomShape());
            shapeList.add(single);
        }
        return shapeList;
    }
    private static String getRandomColor() {
        return COLORS[(int)(Math.random()*COLORS.length)];
    }
    private static String getRandomShape() {
        return SHAPES[(int)(Math.random()*COLORS.length)];
    }
}

 

BeanMapUtis代码:

import org.springframework.cglib.beans.BeanMap;
import java.lang.reflect.InvocationTargetException;
import java.util.*;

public class BeanMapUtils {
    /**
     * 将对象转换为map
     * @param bean
     * @return
     */
    public static <T> Map<String, Object> changeBeanToMap(T bean) {
        Map<String, Object> map = new HashMap<>();
        if (bean != null) {
            BeanMap beanMap = BeanMap.create(bean);
            for (Object key : beanMap.keySet()) {
                map.put(String.valueOf(key), beanMap.get(key));
            }
        }
        return map;
    }

    /**
     * 将map转换为bean对象
     * @param map
     * @param bean
     * @return
     */
    public static <T> T changeMapToBean(Map<String, Object> map, T bean) {
        BeanMap beanMap = BeanMap.create(bean); // 识别对应类型的内容
        beanMap.putAll(map); // 添加数据
        return bean;
    }

    /**
     * 将List<Bean>转换为List<Map<String, Object>>
     *
     * @param sourceList
     * @return
     */
    public static <T> List<Map<String, Object>> changeBeansToList(List<T> sourceList) {
        List<Map<String, Object>> srclist = Collections.emptyList();
        if (sourceList != null && sourceList.size() > 0) {
            srclist = new ArrayList<>(sourceList.size());
            Map<String, Object> map;
            for (T bean : sourceList) {
                map = changeBeanToMap(bean);
                srclist.add(map);
            }
        }
        return srclist;
    }

    /**
     *  将List<Map<String,Object>>转换为List<Bean>
     * @param sourceList
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> List<T> changeListToBeans(List<Map<String, Object>> sourceList, Class<T> clazz) {
        List<T> srclist = Collections.emptyList();
        if (sourceList != null && sourceList.size() > 0) {
            try {
                srclist = new ArrayList<>(sourceList.size());
                T bean;
                for (Map<String, Object> map1 : sourceList) {
                    bean = changeMapToBean(map1, clazz.getDeclaredConstructor().newInstance());
                    srclist.add(bean);
                }
            } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException | InstantiationException ex) {
                ex.printStackTrace();
            }
        }
        return srclist;
    }
}

 

1,对比Bean对象转换为List的情况

测试:

private final static int SIZE = 1500000;
private static List<Map<String, Object>> shapeLists = ShapeListMapFactory.create(SIZE);
private static List<Shape> shapeBeanList = ShapeFactory.create(SIZE);

public static void main(String[] args) {
    System.out.println("======== compare BeanMap and JOSN change beans to list ===========");
    testBeansToList();
    changeBeansToListMap();
}

public static void testBeansToList(){
    System.out.println("========== BeanMapUtils change beans to listMap ============");
    long startTime = System.currentTimeMillis();
    BeanMapUtils.changeBeansToList(shapeBeanList);
    long endTime = System.currentTimeMillis();
    System.out.println("BeanMapUtils.beansToMaps 转换耗费的时间:" + (endTime - startTime) + "ms");
}

public static void changeBeansToListMap() {
    List<Map> mapList=new ArrayList<>();
    System.out.println("========== JSON change beans to list ============");
    long startTime = System.currentTimeMillis();
    for(Object shape: shapeBeanList){
        Map map = JSON.parseObject(JSONObject.toJSONString(shape), Map.class);
        mapList.add(map);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("JSON BeanToListMap 转换耗费的时间:" + (endTime - startTime) + "ms");
}

 

将size改为: 1500000

 

结果1:

======== compare BeanMap and JOSN change beans to list ===========

========== BeanMapUtils change beans to listMap ============

BeanMapUtils.beansToMaps 转换耗费的时间:2071ms

========== JSON change beans to list ============

JSON BeanToListMap 转换耗费的时间:1571ms

 

结果2:

======== compare BeanMap and JOSN change beans to list ===========

========== BeanMapUtils change beans to listMap ============

BeanMapUtils.beansToMaps 转换耗费的时间:1668ms

========== JSON change beans to list ============

JSON BeanToListMap 转换耗费的时间:1074ms

 

将size改为: 2000000

 

结果3:

======== compare BeanMap and JOSN change beans to list ===========

========== BeanMapUtils change beans to listMap ============

BeanMapUtils.beansToMaps 转换耗费的时间:1668ms

========== JSON change beans to list ============

JSON BeanToListMap 转换耗费的时间:1074ms

 

结果4:

======== compare BeanMap and JOSN change beans to list ===========

========== BeanMapUtils change beans to listMap ============

BeanMapUtils.beansToMaps 转换耗费的时间:2267ms

========== JSON change beans to list ============

JSON BeanToListMap 转换耗费的时间:9948ms

 

分析:

  有结果可以看出,超过2百万的时候,JSON处理把beans转为list的时候,效率会低很多,但是在1百万以内的数据,使用JSON的效率会更好。

 

2,对比 将List转换为Bean对象

 

测试:

 

private final static int SIZE = 1500000;
private static List<Map<String, Object>> shapeLists = ShapeListMapFactory.create(SIZE);
private static List<Shape> shapeBeanList = ShapeFactory.create(SIZE);

public static void main(String[] args) {
    System.out.println("======== compare BeanMap and JOSN change list to beans ===========");
    testListToBeans();
    testListMapToBeans();
}

public static void testListToBeans(){
    System.out.println("======== BeanMapUtils change listMap to beans ========");
    long startTime = System.currentTimeMillis();
    BeanMapUtils.changeListToBeans(shapeLists, Shape.class);
    long endTime = System.currentTimeMillis();
    System.out.println("BeanMapUtils.mapsToBeans 转换耗费的时间:" + (endTime - startTime) + "ms");
}

public static void testListMapToBeans() {
    List<Shape> shapeList=new ArrayList<>();
    System.out.println("========== JSON change list to Bean ============");
    Shape single;
    long startTime = System.currentTimeMillis();
    for(Object map: shapeLists){
        single= JSON.parseObject(JSONObject.toJSONString(map),Shape.class);
        shapeList.add(single);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("JSON ListMapToBean 转换耗费的时间:" + (endTime - startTime) + "ms");
}
 

 

size: 1500000

结果1:

======== compare BeanMap and JOSN change list to beans ===========

======== BeanMapUtils change listMap to beans ========

BeanMapUtils.mapsToBeans 转换耗费的时间:462ms

========== JSON change list to Bean ============

JSON ListMapToBean 转换耗费的时间:1135ms

结果2:

======== compare BeanMap and JOSN change list to beans ===========

======== BeanMapUtils change listMap to beans ========

BeanMapUtils.mapsToBeans 转换耗费的时间:460ms

========== JSON change list to Bean ============

JSON ListMapToBean 转换耗费的时间:1176ms

size: 2000000

结果3:

======== compare BeanMap and JOSN change list to beans ===========

======== BeanMapUtils change listMap to beans ========

BeanMapUtils.mapsToBeans 转换耗费的时间:1988ms

========== JSON change list to Bean ============

JSON ListMapToBean 转换耗费的时间:1455ms

 

结果4:

======== compare BeanMap and JOSN change list to beans ===========

======== BeanMapUtils change listMap to beans ========

BeanMapUtils.mapsToBeans 转换耗费的时间:2723ms

========== JSON change list to Bean ============

JSON ListMapToBean 转换耗费的时间:2196ms

 

分析:

    有结果可以看出,超过2百万的时候,使用JSON处理把list转为beans的时候,效率会更好,但是在1百万以内的数据,反而使用BeanMap的效率会更好。跟上一个的内容的结论正好反过来了。大家可以改改改size的值进行测试比较。

 

总结

    比较完两者的效率,在数据量很大的情况下,进行Bean转为为List的情况下,BeanMap的方式比较合适。

   不过实际中一般也不会进行那样大量的转换。项目里面有fastjson的话,就优先考虑使用JSON的方式去处理,没有就用BeanMap的方式去处理。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天狼1222

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

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

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

打赏作者

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

抵扣说明:

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

余额充值