Gson、Fastjson和Jackson速度对比

Gson
  1. 依赖
 <dependency>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
       <version>2.8.5</version>
 </dependency>
  1. 工具类
private GsonUtil() {
    }

    private static Gson gson = null;

    static {
        gson = new Gson();
    }

    /**
     * 将object对象转成json字符串
     *
     * @param object
     * @return
     */
    public static String getGsonByObject(Object object) {
        String gsonString = null;
        if (gson != null) {
            gsonString = gson.toJson(object);
        }
        return gsonString;
    }


    /**
     * 将gsonString转成泛型bean
     *
     * @param gsonString
     * @param cls
     * @return
     */
    public static <T> T gsonToBean(String gsonString, Class<T> cls) {
        T t = null;
        if (gson != null) {
            t = gson.fromJson(gsonString, cls);
        }
        return t;
    }


    /**
     * 转成list
     * 泛型在编译期类型被擦除导致报错
     * @param gsonString
     * @param cls
     * @return
     */
    public static <T> List<T> gsonToList(String gsonString, Class<T> cls) {
        List<T> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
            }.getType());
        }
        return list;
    }


    /**
     * 转成list
     * 解决泛型问题
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> List<T> jsonToList(String json, Class<T> cls) {
        Gson gson = new Gson();
        List<T> list = new ArrayList<T>();
        JsonArray array = new JsonParser().parse(json).getAsJsonArray();
        for(final JsonElement elem : array){
            list.add(gson.fromJson(elem, cls));
        }
        return list;
    }




    /**
     * 转成list中有map的
     *
     * @param gsonString
     * @return
     */
    public static <T> List<Map<String, T>> gsonToListMaps(String gsonString) {
        List<Map<String, T>> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString,
                    new TypeToken<List<Map<String, T>>>() {
                    }.getType());
        }
        return list;
    }


    /**
     * 转成map的
     *
     * @param gsonString
     * @return
     */
    public static <T> Map<String, T> gsonToMaps(String gsonString) {
        Map<String, T> map = null;
        if (gson != null) {
            map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
            }.getType());
        }
        return map;
    }
  1. 实体
@Data
public class UserDto {
    private Integer id;
    private String account;
    private String userName;
    private String idCard;
    private String Addr;
}
  1. 测试说明,程序封装200000个UserDto对象,测试10次。
  2. 序列化测试(Object转Json)
工具次数毫秒
gson第1次585
gson第2次463
gson第3次536
gson第4次626
gson第5次555
gson第6次521
gson第7次527
gson第8次448
gson第9次568
gson第10次696
  1. 反序列化(Json转Object)
工具次数毫秒
gson第1次357
gson第2次314
gson第3次319
gson第4次296
gson第5次289
gson第6次324
gson第7次301
gson第8次299
gson第9次313
gson第10次326

Fastjson
  1. 依赖
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.29</version>
        </dependency>
  1. 工具类
  private FastJsonUtil() {
    }
    
    private static SerializerFeature[] feature = {
            //解决FastJson循环引用的问题
            SerializerFeature.DisableCircularReferenceDetect,
            //排序
            SerializerFeature.SortField
    };
    private static SerializeConfig mapping = new SerializeConfig();

    static {
        mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
        mapping.put(Timestamp.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));//数据库的一个时间类型
    }

    /**
     * 将对象转换成JSON字符串 --固定时间格式"yyyy-MM-dd HH:mm:ss"
     *
     * @param BO/VO,map,数组,list 对象
     * @return JSON字符串
     * @说明:对bean中有Date类型的数据可以成功转换成yyyy-MM-dd HH:mm:ss格式的时间类型,例如:"barDate":yyyy-MM-dd HH:mm:ss
     */
    public static String getJsonByObj(Object bean) {
        return getJsonByObj(bean, mapping);
    }

    /**
     * 将对象转换成JSON字符串 --特定时间格式--所有Key为小写
     *
     * @param BO/VO,map,数组,list 对象
     * @return JSON字符串
     * @dateType 时间格式转换后的字符串格式,例如yyyy-MM-dd HH:mm:ss
     * @说明:对bean中有Date类型的数据可以成功转换成yyyy-MM-dd HH:mm:ss格式的时间类型,例如:"barDate":yyyy-MM-dd HH:mm:ss
     */
    public static String getJsonByObj(Object bean, String dateType) {
        SerializeConfig zdymapping = new SerializeConfig();
        zdymapping.put(Date.class, new SimpleDateFormatSerializer(dateType));
        return getJsonByObj(bean, zdymapping);
    }

    /**
     * 将对象转换成JSON字符串 ---效率高一些--不处理key 也不处理循环引用的问题--也不处理时间格式
     *
     * @param BO/VO,map,数组,list 对象
     * @return JSON字符串
     * @说明:对bean中有Date类型的数据可以成功转换成long格式的时间类型,例如:"barDate":1458268099098
     */
    public static String getJsonDefaultByObj(Object bean) {
        return JSON.toJSONString(bean);
    }

    /**
     * 将JSON数据转换为ListBean集合
     *
     * @param <T>
     * @param json  JSON数组数据
     * @param calzz 待转换的Bean类型 --LinkedCaseInsensitiveMap
     * @return
     */
    public static <T> List<T> getListBean(String json, Class<T> calzz) {
        return JSON.parseArray(json, calzz);
    }

    /**
     * 将JSON数据转换为List集合
     *
     * @param <T>
     * @param json  JSON数组数据
     * @param calzz 待转换的Bean类型 --LinkedCaseInsensitiveMap
     * @return
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static List getList(String json, Class calzz) {
        return getListBean(json, calzz);
    }

    /**
     * 将JSON数据转换为 Java Bea n对象
     *
     * @param json  JSON字符串
     * @param calzz 待转换的Bean类型--LinkedCaseInsensitiveMap
     * @return
     */
    public static <T> T getObjet(String json, Class<T> calzz) {
        return JSON.parseObject(json, calzz);
    }

    /***
     * 通用封装--获取json字符串
     * @param bean 对象
     * @param mappingx 时间类型计划等
     * @return
     */
    private static String getJsonByObj(Object bean, SerializeConfig mappingx) {
        String json = JSON.toJSONString(bean, mappingx,  feature);
        json = stringToJson(json);
        return json; //所有Key为小写
    }

    /**
     * 当文本中含有如下特殊字符时,此方法可以成功处理,让其在前台被正确解析,注意:此法不能处理单引号
     *
     * @param s
     * @return
     */
    public static String stringToJson(String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
				/*case '\"':
					sb.append("\\\"");
					break;*/
                case '\\':   //如果不处理单引号,可以释放此段代码,若结合下面的方法处理单引号就必须注释掉该段代码
                    sb.append("\\\\");
                    break;
                case '/':
                    sb.append("\\/");
                    break;
                case '\b':      //退格
                    sb.append("\\b");
                    break;
                case '\f':      //走纸换页
                    sb.append("\\f");
                    break;
                case '\n':
                    sb.append("\\n"); //换行
                    break;
                case '\r':      //回车
                    sb.append("\\r");
                    break;
                case '\t':      //横向跳格
                    sb.append("\\t");
                    break;
                default:
                    sb.append(c);
            }
        }
        return sb.toString();
    }

  1. 实体
@Data
public class UserDto {
    private Integer id;
    private String account;
    private String userName;
    private String idCard;
    private String Addr;
}
  1. 测试说明,程序封装200000个UserDto对象,测试10次。
  2. 序列化测试(Object转Json)
工具次数毫秒
fastjson第1次651
fastjson第2次673
fastjson第3次632
fastjson第4次660
fastjson第5次669
fastjson第6次697
fastjson第7次719
fastjson第8次817
fastjson第9次669
fastjson第10次709
  1. 反序列化测试(Json转Object)
工具次数毫秒
fastjson第1次143
fastjson第2次140
fastjson第3次140
fastjson第4次158
fastjson第5次161
fastjson第6次159
fastjson第7次155
fastjson第8次158
fastjson第9次179
fastjson第10次157

Jackson
  1. 依赖
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>
  1. 工具类
private JacksonUtil() {
    }

    private static final ObjectMapper mObjectMapper = new ObjectMapper();
    private static final ObjectMapper mObjectMapperLowerCaseWithUnderScores = new ObjectMapper();

    //在这里进行配置全局
    static {
        //有时JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段(java 原始类型)没有在实体类中找到
        //设置为false即不抛出异常,并设置默认值 int->0 double->0.0
        mObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        mObjectMapperLowerCaseWithUnderScores.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //序列化时添加下划线
        mObjectMapperLowerCaseWithUnderScores.setPropertyNamingStrategy(new PropertyNamingStrategy.SnakeCaseStrategy());
    }

    public static String beanToJson(Object object) {
        if (object != null) {
            try {
                return mObjectMapper.writeValueAsString(object);
            } catch (JsonProcessingException e) {
                System.out.println("bean to json exception");
            }
        }
        return "";
    }

    public static <T> T jsonToBean(String json, Class<T> classType) {
        if (StringUtils.isNotBlank(json) && classType != null) {
            try {
                return mObjectMapper.readValue(json, classType);
            } catch (IOException e) {
                System.out.println("json to bean exception");
            }
        }
        return null;
    }

    public static <T> List<T> jsonToList(String json, Class<T> classType) {
        if (StringUtils.isNotBlank(json) && classType != null) {
            try {
                return mObjectMapper.readValue(json, mObjectMapper.getTypeFactory().constructCollectionType(List.class, classType));
            } catch (IOException e) {
                System.out.println("json to list exception");
            }
        }
        return null;
    }

    public static <k, v> Map<k, v> jsonToMap(String json, Class<k> kType, Class<v> vType) {
        if (StringUtils.isNotBlank(json)) {
            try {
                return mObjectMapper.readValue(json, mObjectMapper.getTypeFactory().constructMapType(Map.class, kType, vType));
            } catch (IOException e) {
                System.out.println("json to Map exception");
            }
        }
        return null;
    }

    public static String beanToJsonByLowerCase(Object object) {
        if (object != null) {
            try {
                return mObjectMapperLowerCaseWithUnderScores.writeValueAsString(object);
            } catch (JsonProcessingException e) {
                System.out.println("bean to json with lowerCase exception");
            }
        }
        return "";
    }

    public static <T> T jsonToBeanByLowerCase(String json, Class<T> classType) {
        if (StringUtils.isNotBlank(json)) {
            try {
                return mObjectMapperLowerCaseWithUnderScores.readValue(json, classType);
            } catch (IOException e) {
                System.out.println("json to Bean with lowerCase exception");
            }
        }
        return null;
    }
  1. 实体
@Data
public class UserDto {
    private Integer id;
    private String account;
    private String userName;
    private String idCard;
    private String Addr;
}
  1. 测试说明,程序封装200000个UserDto对象,测试10次。
  2. 序列化测试(Object转Json)
工具次数毫秒
jackson第1次598
jackson第2次533
jackson第3次510
jackson第4次558
jackson第5次503
jackson第6次507
jackson第7次490
jackson第8次503
jackson第9次523
jackson第10次527
  1. 反序列化测试(Json转Object)
工具次数毫秒
jackson第1次412
jackson第2次374
jackson第3次276
jackson第4次316
jackson第5次311
jackson第6次311
jackson第7次327
jackson第8次318
jackson第9次317
jackson第10次304
小结
  1. 序列化比较结果(Object转Json)
工具次数据最快最慢平均
gson10468696552.5
fastjson10632817689.6
jackson10276490598
  1. 反序列化比较结果(Json转Object)
工具次数据最快最慢平均
gson10289357313.8
fastjson10140179155
jackson10276412326.6
  1. 结论
    序列化,三个工具类都差不多;反序列化fastjson很出色。所以以后在项目中直接使用fastjson工具类即可。
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值