Java常用JSON库性能及特点比较,常用工具方法

  • 四种库序列化,反序列化性能对比
  • 四种库对空值属性的处理
    • 测试
    • 结果
    • 结论
  • 四种库的工具类
    • FastJsonUtil
    • GsonUtil
    • JacksonUtil
    • JsonLibUtil

四种库序列化,反序列化性能对比

  • JMH做的序列化,反序列化的性能测试
  • 10W次测试结果如下
    序列化性能:FastJson>Jackson>Gson>Jsonlib
    反序列化性能:Gson>Jackson>FastJson>Jsonlib

四种库对空值属性的处理

测试

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;/*** json测试对象** @author fan*/
@Setter
@Getter
@AllArgsConstructor
public class Student {private String name;private String password;private Integer age;private String[] hobbies;private Student deskMate;
}
import com.ultra.util.FastJsonUtil;
import com.ultra.util.GsonUtil;
import com.ultra.util.JacksonUtil;
import com.ultra.util.JsonLibUtil;
import org.junit.Test;/*** json测试工具** @author fan*/
public class JsonUtilTest {@Testpublic void testJson() {Student student = new Student("AA", null, null, null, null);System.out.println("FastJson: " + FastJsonUtil.getJson(student));System.out.println("Gson: " + GsonUtil.bean2Json(student));System.out.println("Jackson: " + JacksonUtil.bean2Json(student));System.out.println("JsonLib: " + JsonLibUtil.bean2Json(student));}
}

结果

FastJson: {"name":"AA"}
Gson: {"name":"AA"}
Jackson: {"name":"AA","password":null,"age":null,"hobbies":null,"deskMate":null}
JsonLib: {"age":0,"deskMate":null,"hobbies":[],"name":"AA","password":""}

结论

  • FastJson:忽略空值的属性,空集合的属性
  • Gson:忽略空值的属性,空集合的属性
  • Jackson:空值的属性和空集合的属性值是null
  • JsonLib:基本数据类型包装类会初始化值,String属性会初始化"";其他空值属性的值是null,空集合的属性值是[]

四种库的工具类

FastJsonUtil

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;import java.util.List;/*** @author admin*/
public class FastJsonUtil {/*** json转对象** @param jsonString  json* @param requestType <T>类型的class对象* @param <T>         对象类型* @return 对象*/public static <T> T json2Bean(String jsonString, Class<T> requestType) {return JSON.parseObject(jsonString, requestType);}/*** json转对象集合** @param jsonString json* @return 对象集合*/public static <T> List<T> json2Beans(String jsonString, Class<T> requestType) {return JSON.parseArray(jsonString, requestType);}/*** 对象转json** @param javaObject 对象* @return json*/public static String bean2Json(Object javaObject) {return JSONObject.toJSONString(javaObject);}/*** 集合转json** @param list 集合或者数组* @return json串*/public static String beans2Json(Object list) {return JSONObject.toJSONString(list);}
}

GsonUtil

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;import java.util.List;public class GsonUtil {private static final Gson GSON = new GsonBuilder().create();/*** 对象、集合转json** @param obj 对象* @return json*/public static String bean2Json(Object obj) {return GSON.toJson(obj);}/*** json转对象** @param jsonString json* @param objClass   对象类型* @param <T>        对象类型* @return 对象*/public static <T> T json2Bean(String jsonString, Class<T> objClass) {return GSON.fromJson(jsonString, objClass);}/*** json转集合* TODO 返回的对象不是List<T>,而是List<com.google.gson.internal.LinkedTreeMap>,强转是会报错;待优化** @param jsonString json* @param <T>        对象类型* @return 对象集合*/public static <T> List<T> json2Beans(String jsonString) {return GSON.fromJson(jsonString, new TypeToken<List<T>>() {}.getType());}}

JacksonUtil

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** @author admin*/
public class JacksonUtil {private static final Logger logger = LoggerFactory.getLogger(JacksonUtil.class);private static final ObjectMapper MAPPER = new ObjectMapper();/*** 对象、集合转json** @param obj 对象* @return json*/public static String bean2Json(Object obj) {try {return MAPPER.writeValueAsString(obj);} catch (JsonProcessingException e) {logger.error("", e);return null;}}/*** json转对象** @param jsonString json* @param objClass   对象的Class* @param <T>        对象类型* @return 对象*/public static <T> T json2Bean(String jsonString, Class<T> objClass) {try {return MAPPER.readValue(jsonString, objClass);} catch (IOException e) {logger.error("", e);return null;}}/*** json转集合** @param jsonString json* @param objClass   对象的Class* @param <T>        对象类型* @return 对象集合*/public static <T> List<T> json2Beans(String jsonString, Class<T> objClass) {try {JavaType javaType = getCollectionType(objClass);return MAPPER.readValue(jsonString, javaType);} catch (IOException e) {logger.error("", e);return null;}}/*** 获取泛型的Collection Type** @param elementClass 元素类* @return JavaType Java类型*/private static JavaType getCollectionType(Class<?> elementClass) {return MAPPER.getTypeFactory().constructParametricType(ArrayList.class, elementClass);}
}

JsonLibUtil

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;import java.util.ArrayList;
import java.util.List;/*** 注意:bean2Json需要无参构造器** @author admin*/
public class JsonLibUtil {/*** 对象转json** @param obj 对象* @return json*/public static String bean2Json(Object obj) {JSONObject jsonObject = JSONObject.fromObject(obj);return jsonObject.toString();}/*** 集合转json** @param list 集合* @return json*/public static String beans2Json(Object list) {JSONArray jsonArray = JSONArray.fromObject(list);return jsonArray.toString();}/*** json转对象** @param jsonString json* @param objClass   对象类型* @param <T>        对象类型* @return 对象*/public static <T> T json2Bean(String jsonString, Class<T> objClass) {return (T) JSONObject.toBean(JSONObject.fromObject(jsonString), objClass);}/*** json转集合** @param jsonString json* @param objClass   对象类型* @param <T>        对象类型* @return 集合*/public static <T> List<T> json2Beans(String jsonString, Class<T> objClass) {JSONArray jsonArray = JSONArray.fromObject(jsonString);return new ArrayList<T>(JSONArray.toCollection(jsonArray, objClass));}
}

Java常用JSON库FastJson,Gson,Jackson,Json-lib性能及特点比较,常用工具方法相关推荐

  1. Json的FastJson与Jackson

    FastJson 需要引入 fastjson-1.2.40.jar包 FastJson的介绍 JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下FastJson,FastJson ...

  2. Struts2.0第三章(文件上传、ajax开发、json、Fastjson、Jackson、注解开发)

    Struts2.0文件上传: 浏览器端注意事项: 1.表单提交方式method = post: 2.表单中必须有一个<input type="file" name = &qu ...

  3. pythonos pathjson_python进阶05 常用问题库(1)json os os.path模块

    python进阶05 常用问题库(1)json os os.path模块 一.json模块(数据交互) web开发和爬虫开发都离不开数据交互,web开发是做网站后台的,要跟网站前端进行数据交互 1.什 ...

  4. 【Java】【序列化】gson实现json美化

    GsonBuilder builder = new GsonBuilder();builder.setPrettyPrinting();gson = builder.create();//如果是对象, ...

  5. 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)

    Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...

  6. 1. 初识Jackson -- 世界上最好的JSON库

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

  7. 初识Jackson——世界上最好的JSON库

    一个工程仅需一个JSON库 Java的JSON库,你至少应该用过/听过这三种:Jackson.Gson.Fastjson.一个独立的工程,按照依赖最少原则,本应该only one JSON库是足矣的. ...

  8. 常用json框架介绍和Jackson返回结果处理

    常用json框架介绍和Jackson返回结果处理     简介:介绍常用json框架和注解的使用,自定义返回json结构和格式 1.常用框架 阿里 fastjson,谷歌gson等         J ...

  9. Json学习总结(9)——放弃FastJson!Jackson的功能原来如此之牛

    什么是Jackson Jackson是比较主流的基于Java的JSON类库,可用于Json和XML与JavaBean之间的序列化和反序列化.没看错,Jackson也可以处理JavaBean与XML之间 ...

  10. Java - Jackson JSON Java Parser API

    文章目录 概述 依赖 Jackson JSON示例 基础数据 JSON转换为Java对象 Jackson JSON –将JSON转换为Map 概述 Jackson JSON Java Parser非常 ...

最新文章

  1. AC日记——友好城市 洛谷 P2782
  2. 每天一道LeetCode-----找到给定数组中第三大的值
  3. SQL Server 2008 R2 安装
  4. 蒙特.卡罗方法求解圆周率近似值原理与Python实现
  5. 软件测试过程中的度量与分析
  6. Enterprise Library Policy Injection Application Block 之一: PIAB Overview
  7. CenterNet++ | CenterNet携手CornerNet终于杀回来了,实时高精度检测值得拥有!
  8. 替代传统按键方案 单通道感应TTP223E-BA6 TTP223E-CA6 TTP223E-HA6 单按键触摸检测IC
  9. 利用THINKPHP框架开发的自定义表单及数据字典模板
  10. Can I insert a countdown timer in a Powerpoint presentation?
  11. Java可以做什么工作
  12. 排列怎么用计算机计算公式,数学排列组合公式计算器
  13. c语言if函数的作用是什么意思,if是什么意思_if,意思_词汇大全意思全集
  14. NCRE-嵌入式系统开发工程师-操作系统知识整理
  15. IDEA 打包项目时xml,yml,properties等文件不复制
  16. unity软粒子softparticle仿真实现
  17. A005-软件结构-从前后台到调度器
  18. 算法研究NO7.数字滤波
  19. Android ORM框架GreenDao用法
  20. 条码查询接口,商品条码和药品条码查询

热门文章

  1. python文件操作:文件指针移动、修改
  2. 如何在virtualenv环境中安装指定的python版本
  3. ftl转pdf及问题集锦
  4. 【转】hadoop2.6 配置lzo压缩
  5. 20150406--RBAC+添加字段栏目
  6. Flash游戏开发常用函数代
  7. loadrunner 服务器性能监控,Loadrunner 性能测试服务器监控指标
  8. Linux基础命令及其常识
  9. 游戏开发筑基之输出中设置颜色(C语言)
  10. uestc--758--P酱的冒险旅途