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


    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 +  "]
    ";
            if(friends!=null){
                str+="Friends:
    ";
                for (Person f : friends) {
                    str+="	"+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);
            }
        }
    }
    复制代码

     

    参考:http://www.json.org/json-zh.html

  • 相关阅读:
    第八周上机作业
    第七周课后作业
    第七周上机作业
    第六周课后作业
    第六周上机
    第九周JAVA
    第八周JAVA
    第8次JAVA作业
    第七周JAVA
    第7周JAVA
  • 原文地址:https://www.cnblogs.com/wych/p/4120858.html
Copyright © 2020-2023  润新知