下载地址(maven)

  Jackson:http://mvnrepository.com/search?q=jackson

  FastJson:http://mvnrepository.com/search?q=FastJson

  Gson:http://mvnrepository.com/search?q=Gson

下载教程(已gson为例):

简单了解

一、Jackson

 1、简介:

 Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

2、解析原理:

  基于事件驱动,与GSON相同,先创建一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。但和Gson解析不同的是,GSON可按需解析,即创建的JavaBean类不一定完全涵盖所要解析的JSON数据,按需创建属性,但Jackson解析对应的JavaBean必须把Json数据里面的所有key都有所对应,即必须把JSON内的数据所有解析出来,无法按需解析。但Jackson的解析速度和效率都要比GSON高   

3、优势

1、解析效率最高 

2、在数据量大的情况优势尤为明显、占存少

4、缺点

必须完全解析文档,如果要按需解析的话可以拆分Json来读取,操作和解析方法复杂;

5、推荐使用情景

适用于需要处理超大型JSON文档、不需要对JSON文档进行按需解析、、性能要求较高的场合

6、代码:

 public static void main(String[] args) {
        System.out.println(toJson(new user(1,"张三","男",new Date())));
    }
    public static String toJson(Object obj){
        String re=null;
        //对象映射
        ObjectMapper objectMapper=new ObjectMapper();
        //设置时间格式
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        objectMapper.setDateFormat(dateFormat);
        try {
            re=objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return re;
    }

 

  user代码

package com;

import java.util.Date;

public class user {
    int id;
    String name;
    String sex;
    Date birthday;

    public user(int id, String name, String sex, Date birthday) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.birthday = birthday;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public user() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public user(int id, String name, String sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
}

View Code

运行结果

 

二、Gson

1、简介:

 Google提供的用来java对象和JSON数据之间进行映射的JAVA类库,可以将一个JSON字符转成一个java对象,反过来也OK。

2、解析原理:

 

3、优势

1、快速,高效 
2、代码量少 
3、面向对象 
4、数据传输解析方便 

4、注意事项

1、内部嵌套的类必须是static的,要不然解析会出错; 
2、类里面的属性名必须跟Json字段里面的Key是一模一样的; 
3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List< B> b,而只用{}嵌套的就定义为 public C c,是不是很简单,而且现在android studio上可以直接用插件生成实体类,那更加方便了

5、代码

public static void main(String[] args) {
        System.out.println(toJson(new user(1, "张三", "男", new Date())));
    }
    public static String toJson(Object obj){
        String re=null;
            Gson gson=new Gson();
        re= gson.toJson(obj);
        return  re;
    }
//反序列化 gson.formJson()
// List<String> ls = gson.fromJson(aaa,new TypeToken<List<String>>(){}.getType());

 user代码在上面

三、FastJson 

1、简介:

FastJson是阿里巴巴公司提供的一个用Java语言编写的高性能功能完善的JSON库,该库涉及的最基本功能就是序列化和反序列化。Fastjson支持java bean的直接序列化,同时也支持集合、Map、日期、Enum和泛型等的序列化。你可以使用com.alibaba.fastjson.JSON这个类进行序列化和反序列化,常用的序列化操作都可以在JSON类上的静态方法直接完成。Fastjson采用独创的算法,将parse的速度提升到极致,号称超过所有Json库。而且,使用Fastjson解析时,除了需要使用Fastjson所提供的jar包外,再不需要额外的jar包,就能够直接跑在JDK上。

2、解析原理:

  基于事件驱动,与GSON相同,先创建一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。但和Gson解析不同的是,GSON可按需解析,即创建的JavaBean类不一定完全涵盖所要解析的JSON数据,按需创建属性,但Jackson解析对应的JavaBean必须把Json数据里面的所有key都有所对应,即必须把JSON内的数据所有解析出来,无法按需解析。但Jackson的解析速度和效率都要比GSON高   

3、优势

1、快速FAST(比任何一款都快) 
2、面向对象 
3、功能强大(支持普通JDK类任意java bean Class,Collection,Map,Date或者enum) 
4、零依赖(只需要有JDK即可) 
5、支持注解,全类型序列化

4、代码

import com.alibaba.fastjson.JSON;

import java.util.Date;

public class faskjson {
    public static void main(String[] args) {
        System.out.println(JSON.toJSONString(new user(1, "张三", "男", new Date())));
    }

}

 

 user代码在上面

运行结果

上面介绍了Jackson、Gson、FastJson的基本内容,细心的朋友可能发现介绍Gson与FastJson时我并未提及他们的缺点,并不是说这2个框架没有缺点,只是相对与其他的框架他们的缺点并不突出。

上面特别介绍了Jackson的缺点,以及推荐了它使用的场景,那么其他场景下还是不建议大家使用,这点对于开发者来说其实也是需要考虑的一个问题,如果该库的API使用难度大,或者很复杂,那么不建议使用,毕竟JSON解析的性能差异并不大。

JSON序列化(Object => JSON)

测试样本数量为100000个,为了保证每个类库在测试中都能处理同一个样本,先把样本Java对象保存在文件中。每个类库测试3次,每次循环测试10遍,去掉最快速度和最慢速度,对剩下的8遍求平均值作为最终的速,取3次测试中最好的平均速度作为最终的测试数据。

类库 样本数量 执行次数 最长时间(毫秒) 最短时间(毫秒) 平均时间(毫秒)
FastJSON 100000 10 2291.22 1416.70 1454.93
Jackson 100000 10 1980.92 841.91 880.82
Gson 100000 10 2383.02 1469.08 1520.38

 从测试数据可知,FastJSON和GsonJSON序列化的速度差不多,Jackson是最快的(用时Gson少大约600毫秒)。

JSON反序列化(JSON => Object)

测试样本数量为100000个,为了保证每个类库在测试中都能处理同一个样本,先把样本JSON对象保存在文件中。每个类库测试3次,每次循环测试10遍,去掉最快速度和最慢速度,对剩下的8遍求平均值作为最终的速,取3次测试中最好的平均速度作为最终的测试数据。

类库 样本数量 执行次数 最长时间(毫秒) 最短时间(毫秒) 平均时间(毫秒)
FastJSON 100000 10 7942.31 6340.55 6526.41
Jackson 100000 10 7957.22 6623.85 6815.41
Gson 100000 10 8235.15 7006.06 7364.75

 从测试数据可知,三个类库在反序列化上性能比较接近,Gson稍微差一些。

总结

把Java对象JSON序列化,Jackson速度最快,在测试中比Gson快接近50%,FastJSON和Gson速度接近。 
把JSON反序列化成Java对象,FastJSON、Jackson速度接近,Gson速度稍慢,不过差距很小。

 

包和项目地址:https://github.com/weibanggang/tojson

 

 

版权声明:本文为weibanggang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/weibanggang/p/9517223.html