`
123003473
  • 浏览: 1064175 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

介绍4款json的java类库 及 其性能测试

 
阅读更多
转载链接:http://www.cnblogs.com/windlaughing/p/3241776.html

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。

下面介绍四款处理json的java类库:Json-lib、Gson、Jackson、Fastjson

一、Json-lib

JSON-lib is a java library for transforming beans, maps, collections, java arrays and XML to JSON and back again to beans and DynaBeans. 官网:http://json-lib.sourceforge.net/

maven依赖配置:

复制代码
         <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
复制代码
示例:

复制代码
    /**
     * 将对象序列化成json字符串
     * @param obj
     * @return
     */
    public static String bean2Json(Object obj){
        JSONObject jsonObject=JSONObject.fromObject(obj);
        return jsonObject.toString();
    }
    
    /**
     * 将json字符串反序列化为对象
     * @param jsonStr
     * @param objClass 反序列化为该类的对象
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return (T)JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass);
    }
复制代码



二、Gson
Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson can work with arbitrary Java objects including pre-existing objects that you do not have source-code of.

官网:https://code.google.com/p/google-gson/

maven依赖:

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>
示例:

复制代码
    public static String bean2Json(Object obj){
        Gson gson = new GsonBuilder().create();
        return gson.toJson(obj);
    }
    
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        Gson gson = new GsonBuilder().create();
        return gson.fromJson(jsonStr, objClass);
    }
    
    /**
     * 把混乱的json字符串整理成缩进的json字符串
     * @param uglyJsonStr
     * @return
     */
    public static String jsonFormatter(String uglyJsonStr){
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser jp = new JsonParser();
        JsonElement je = jp.parse(uglyJsonStr);
        String prettyJsonString = gson.toJson(je);
        return prettyJsonString;
    }
复制代码
 


三、Jackson
Jackson is a high-performance JSON processor (parser, generator)。官网:http://jackson.codehaus.org/Home

maven依赖:

<dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
示例:

复制代码
public static String bean2Json(Object obj) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        StringWriter sw = new StringWriter();
        JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
        mapper.writeValue(gen, obj);
        gen.close();
        return sw.toString();
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
            throws JsonParseException, JsonMappingException, IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(jsonStr, objClass);
    }
复制代码



四、FastJson

Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。网址:https://github.com/alibaba/fastjson

maven依赖配置:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.35</version>
        </dependency>
示例:

复制代码
    public static String bean2Json(Object obj){
        return JSON.toJSONString(obj);
    }
    
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return JSON.parseObject(jsonStr, objClass);
    }
复制代码
 



五、性能测试

1、Java对象序列化为Json字符串:

执行100 0000次转换,各个类库的耗时如下:(以秒为单位)

Gson 48.891s
Json-lib 311.446s
Jackson 19.439s
FastJson 21.706
2、Json字符串 反序列化为Java对象

执行100 0000次转换,各个类库的耗时如下:(以秒为单位)

Gson 39.280s
Json-lib 使用该类库的方法进行转换时(测试代码见下面),抛出异常。其原因是Person类的属性:List<Person> friends,其List中的对象不是Person类型的对象,而是net.sf.ezmorph.bean.MorphDynaBean类型的对象。说明,Json-lib对嵌套的自定义类支持的很差,或许是我写的方法有问题。
Jackson 26.427s
FastJson 40.556

3、总结:

Java Bean序列化为Json,性能:Jackson > FastJson > Gson > Json-lib。这4中类库的序列化结构都正确。

Json字符串反序列化为Java Bean时,性能:Jackson > Gson > FastJson >Json-lib。并且Jackson、Gson、FastJson可以很好的支持复杂的嵌套结构定义的类,而Json-lib对于复制的反序列化会出错。

Jackson、FastJson、Gson类库各有优点,各有自己的专长,都具有很高的可用性。



4、测试用例

1)Java Bean

复制代码
public class Person {
    private String name;
    private FullName fullName;
    private int age;
    private Date birthday;
    private List<String> hobbies;
    private Map<String, String> clothes;
    private List<Person> friends;
   
    //getter setter 方法。略

    @Override
    public String toString() {
        String str= "Person [name=" + name + ", fullName=" + fullName + ", age="
                + age + ", birthday=" + birthday + ", hobbies=" + hobbies
                + ", clothes=" + clothes +  "]\n";
        if(friends!=null){
            str+="Friends:\n";
            for (Person f : friends) {
                str+="\t"+f;
            }
        }
        return str;
    }
   
}

class FullName {
    private String firstName;
    private String middleName;
    private String lastName;
   
  //构造方法、getter setter 方法,略
  
    @Override
    public String toString() {
        return "[firstName=" + firstName + ", middleName="
                + middleName + ", lastName=" + lastName + "]";
    }
   
}
复制代码


2)Json-lib、Gson、Jackson、FastJson类库:

复制代码
import net.sf.json.JSONObject;

public class JsonObjectUtil {

    public static String bean2Json(Object obj){
        JSONObject jsonObject=JSONObject.fromObject(obj);
        return jsonObject.toString();
    }
   
    @SuppressWarnings("unchecked")
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return (T)JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass);
    }
   
}

复制代码
复制代码
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

public class GsonUtil {
    private static Gson gson = new GsonBuilder().create();
   
    public static String bean2Json(Object obj){
        return gson.toJson(obj);
    }
   
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return gson.fromJson(jsonStr, objClass);
    }
   
    public static String jsonFormatter(String uglyJsonStr){
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser jp = new JsonParser();
        JsonElement je = jp.parse(uglyJsonStr);
        String prettyJsonString = gson.toJson(je);
        return prettyJsonString;
    }
}
复制代码
复制代码
import java.io.IOException;
import java.io.StringWriter;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonUtil {
    private static ObjectMapper mapper = new ObjectMapper();
   
    public static String bean2Json(Object obj) throws IOException {
        StringWriter sw = new StringWriter();
        JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
        mapper.writeValue(gen, obj);
        gen.close();
        return sw.toString();
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
            throws JsonParseException, JsonMappingException, IOException {
        return mapper.readValue(jsonStr, objClass);
    }
}
复制代码
复制代码
public class FastJsonUtil {
    public static String bean2Json(Object obj){
        return JSON.toJSONString(obj);
    }
   
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return JSON.parseObject(jsonStr, objClass);
    }
}
复制代码


3)Java对象序列化为Json字符串 测试类:

复制代码
public class TestBean2Json {
    private Person p;
   
    private Person createAPerson(String name,List<Person> friends) {
        Person newPerson=new Person();
        newPerson.setName(name);
        newPerson.setFullName(new FullName("xxx_first", "xxx_middle", "xxx_last"));
        newPerson.setAge(24);
        List<String> hobbies=new ArrayList<String>();
        hobbies.add("篮球");
        hobbies.add("游泳");
        hobbies.add("coding");
        newPerson.setHobbies(hobbies);
        Map<String,String> clothes=new HashMap<String, String>();
        clothes.put("coat", "Nike");
        clothes.put("trousers", "adidas");
        clothes.put("shoes", "安踏");
        newPerson.setClothes(clothes);
        newPerson.setFriends(friends);
        return newPerson;
    }
   
    @Before
    public void init(){
        List<Person> friends=new ArrayList<Person>();
        friends.add(createAPerson("小明",null));
        friends.add(createAPerson("Tony",null));
        friends.add(createAPerson("陈小二",null));
         p=createAPerson("邵同学",friends);
    }
   
//    @Test
    public void testGsonBean2Json(){
        System.out.println(GsonUtil.bean2Json(p));
       
        for (int i = 0; i < 1000000; i++) {
            GsonUtil.bean2Json(p);
        }
    }
   
   
    //@Test
    public void testJsonObjectBean2Json(){
        System.out.println(JsonlibUtil.bean2Json(p));
       
        for (int i = 0; i < 1000000; i++) {
            JsonlibUtil.bean2Json(p);
        }
    }
   
   
//    @Test
    public void testJacksonBean2Json() throws Exception{
        System.out.println(JacksonUtil.bean2Json(p));
       
        for (int i = 0; i < 1000000; i++) {
            JacksonUtil.bean2Json(p);
        }
    }
   
    @Test
    public void testFastJsonBean2Json() throws Exception{
        System.out.println(FastJsonUtil.bean2Json(p));
       
        for (int i = 0; i < 1000000; i++) {
            FastJsonUtil.bean2Json(p);
        }
    }
   
}
复制代码




4)Json字符串 反序列化为Java对象 测试类:

复制代码
public class TestJson2Bean {
    private String jsonStr;
   
    @Before
    public void init(){
         jsonStr="{\"name\":\"邵同学\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":[{\"name\":\"小明\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null},{\"name\":\"Tony\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null},{\"name\":\"陈小二\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null}]}";
    }
   
   
//    @Test
    public void testGsonjson2Bean() throws Exception{
        Person pp=GsonUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);
       
        for (int i = 0; i < 1000000; i++) {
            GsonUtil.json2Bean(jsonStr, Person.class);
        }
    }
   
   
//    @Test
    public void testJsonlibJson2Bean() throws Exception{
        Person pp=JsonlibUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);
       
        for (int i = 0; i < 1000000; i++) {
            JsonlibUtil.json2Bean(jsonStr, Person.class);
        }
    }
   
   
//    @Test
    public void testJacksonJson2Bean() throws Exception{
        Person pp=JacksonUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);
       
        for (int i = 0; i < 1000000; i++) {
            JacksonUtil.json2Bean(jsonStr, Person.class);
        }
    }
   
    @Test
    public void testFastJsonJson2Bean() throws Exception{
        Person pp=FastJsonUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);
       
        for (int i = 0; i < 1000000; i++) {
            FastJsonUtil.json2Bean(jsonStr, Person.class);
        }
    }
}
分享到:
评论

相关推荐

    Java类库大全

    Java类库大全是一个集合了众多Java开发中常用和实用类库的资源集合,旨在为开发者提供便利,提高开发效率。这个资源包包含了丰富的Java库,覆盖了从基础数据类型操作到复杂的网络通信、多线程处理、数据库操作、图形...

    java的各种类库 java包

    总结来说,Java类库和包是Java编程的强大支撑,它们极大地提高了开发效率和代码质量。无论是标准库还是第三方库,都是Java开发者不可或缺的工具。了解并熟练使用这些类库,可以提升编程体验,使开发者能够专注于解决...

    E4A 清明类库(合集)

    E4A,全称是Easy4Android,是一个基于Java语言的Android编程框架,它简化了Android应用的开发过程,使得开发者能够用更简单的语法来编写程序。"E4A清明类库(合集)"是一个专门针对E4A平台设计的类库集合,旨在为...

    基于Java的实例源码-JSON类库 Flexjson.zip

    总结来说,Flexjson是一个强大且易于使用的Java JSON库,尤其适用于快速开发和测试环境。它提供了丰富的功能,能够满足大多数JSON操作需求,对于Java开发者来说是处理JSON数据的一个理想选择。通过深入学习和实践,...

    28个java常用的类库源码

    Java作为一个广泛使用的编程语言,拥有丰富的类库,这些类库为开发者提供了强大的功能,节省了大量编写基础功能的时间。在这个“28个java常用的类库源码”压缩包中,你将找到一些核心且实用的Java工具类源码,这对于...

    JSON序列化工具探析.pdf

    三、四种JSON类库性能测试 3.1 Java对象序列化为JSON字符串 运行100万次转换,以上四种类库的性能测试如下: 表1 Java对象序列化为JSON对象 库名 耗时 Gson 47.891s Json-lib 31.7446s Jackson 20.534s FastJson...

    4个json包,,测试对象,MAP,LIST都行

    3. **json-lib-2.4-jdk15.jar**: JSON Lib 是一个Java的JSON处理器,它支持多种Java类库,包括JDK1.5。这个库提供了将Java对象(如Map、List、自定义对象等)转换为JSON字符串,以及将JSON字符串转换回Java对象的...

    Basic4Android 最新类库

    Basic4Android是一款基于Java语言的开发工具,专为Android应用开发设计。它简化了编程过程,使得开发者可以使用更简单的语法来创建复杂的Android应用程序。"最新类库"指的是Basic4Android提供的最新版本的库文件,...

    Text:一个文本处理类库.zip

    1. **文本解析**:类库可能包含了用于读取和解析不同格式的文本文件(如.txt、.csv、.json等)的函数或类,这有助于将数据从文件中提取出来并进行处理。 2. **字符串操作**:提供了各种字符串操作的方法,如查找、...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java开发中的json_jar包

    4. **与其他库的比较**:与Gson和Jackson相比,json-lib在某些性能测试中可能略逊一筹,但它的优点在于兼容性广泛,对于旧版本的Java或不支持新特性的环境更为友好。Gson和Jackson在性能和易用性方面更胜一筹,特别...

    基于 Mirai 的 Java QQ 机器人类库.zip

    总之,基于Mirai的Java QQ机器人类库提供了一种便捷的方式,让开发者能够快速搭建具备各种功能的QQ机器人,而要充分利用这个类库,开发者需要具备扎实的Java基础,熟悉Mirai API,以及一定的QQ应用开发经验。...

    e4a 易安卓多种类库合集

    - 稳定性:成熟的类库经过多轮测试,通常比自编代码更稳定,减少了bug出现的可能性。 - 社区支持:很多类库都有活跃的开发者社区,遇到问题时可以寻求帮助或找到解决方案。 - 兼容性:高质量的类库会关注Android...

    SSH框架所需类库

    5. **其他辅助库**:如log4j或logback进行日志记录,commons-lang3、commons-fileupload等Apache Commons库提供通用工具函数,junit进行单元测试。 在整合过程中,需要配置相关的XML文件,如struts.xml、spring.xml...

    基于Java的源码-google-api-translate(Java对Google翻译引擎的封装类库).zip

    在这个场景下,"基于Java的源码-google-api-translate(Java对Google翻译引擎的封装类库).zip" 文件提供了一个Java类库,它封装了Google翻译API,简化了与该服务的交互。 这个压缩包中的核心内容是"google-api-...

    json包和js文件

    而`jsonJar`可能是一个包含JSON处理功能的Java类库的JAR文件,用于Java开发。 综上所述,`jquery-3.1.1.min.js`和JSON的`jar包`分别代表了JavaScript和Java环境下处理JSON数据的工具,它们在Web应用中起到了至关...

    小而全的Java工具类库,使Java拥有函数式语言般的优雅.zip

    总结,Hutool作为一款优秀的Java工具库,以其全面的功能、简洁的API和高效的性能,为Java开发者带来了极大的便利。无论你是初学者还是经验丰富的开发者,Hutool都值得你拥有。通过学习和使用Hutool,你将能够更好地...

    Common类库

    以下将详细介绍Common类库可能包含的一些核心知识点及其作用: 1. **数据结构与算法**:Common类库往往提供一些基础的数据结构,如ArrayList、LinkedList、HashMap等,这些数据结构能够方便地存储和操作数据。同时...

    json解析xml 的jar包

    这类库包含了实现JSON操作的类和方法,使得开发者能够在Java程序中轻松地序列化和反序列化JSON数据。 “解析XML”标签则强调了这个jar包除了处理JSON外,还具备解析XML的能力。在Java中,解析XML通常涉及DOM...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics