Fastson,Gson,fasterxml Jackson的比較,Demo示例

寫在前面

關於 java 對象的序列化與反序列化的問題,最近 阿里的fastJson在網上噓聲一片,很多遺留的Bug、issue都未解決等等…

其實也不要太警惕,java 的基本開發中,web開發、大數據開發,我目前接觸、瞭解的也就這兩個主流開發方向,關於對象的構造不是很複雜的話,阿里的FastJson就可以很方便的準確序列化,但是,目前中國,也存在一些真正的大牛、團隊(類似阿里。騰訊,網易、百度等等大廠)在高級的框架設計中,會有頻繁的序列化與反序列化的對象操作,這樣可能對序列化要有更加準確的解析,類似 Spring ,Mybatis,apache 等等,他們都是基於 Jackson(fasterxml )封裝的對象序列化實現方案…

一、簡單比較

這裏比較下,FastJson、Gson、fasterxml jackson的相關基礎

  • FastJson
    在這裏插入圖片描述

  • Gson
    在這裏插入圖片描述

  • jackson

在這裏插入圖片描述
基本性能測試、有興趣的可以去自己測試,序列化/反序列化最重要的準確解析數據。速度不是最重要的

二 、fastJson

2.1、示例一

    /**
     * {"id":123,"name":"一級部門"}
     * @throws Exception
     */
    public void test_0() throws Exception {
        Department dep = new Department();
        dep.setId(123);
        dep.setName("一級部門");
        dep.setParent(dep);        

        String text = JSON.toJSONString(dep);
        System.out.println(text);
        
        JSON.parseObject(text, Department.class);
    }

    public static class Department {

        private int                  id;
        private String               name;
        private Department parent;
        private transient List<Department> children = new ArrayList<Department>();

        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; }
        @JSONField(serialize=false)
        public Department getParent() { return parent; }
        public void setParent(Department parent) { this.parent = parent; }
        public List<Department> getChildren() { return children; }
        public void setChildren(List<Department> children) { this.children = children; }
    }

2.2、示例二

    /**
     * {"name":"Jobs","salary":8000,"age":50}
     * @throws Exception
     */
    public void test_0() throws Exception {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "Jobs");
        jsonObject.put("age", 50);
        jsonObject.put("salary", new BigDecimal(8000));

        String text = jsonObject.toJSONString();
        System.out.println(text);
    }

2.3、示例三

    /**
     * {"id":0,"name":"admin","users":[{"id":2,"name":"guest"},{"id":3,"name":"root"}]}
     * @throws Exception
     */
    public void test_encode() throws Exception {
        Group group = new Group();
        group.setId(0L);
        group.setName("admin");

        User guestUser = new User();
        guestUser.setId(2L);
        guestUser.setName("guest");

        User rootUser = new User();
        rootUser.setId(3L);
        rootUser.setName("root");

        group.getUsers().add(guestUser);
        group.getUsers().add(rootUser);

        String jsonString = JSON.toJSONString(group);

        System.out.println(jsonString);
        
        JSON.parseObject(jsonString, Group.class);
    }

2.4、示例四,name ,value 過濾

public void test_secure() throws Exception {

        ValueFilter filter = new ValueFilter() {

            public Object process(Object source, String name, Object value) {
                if (name.equals("name")) {
                    return "WSJ";
                }
                return value;
            }
        };

        NameFilter nameFilter = new NameFilter() {
            public String process(Object source, String name, Object value) {
                if (name.equals("id")) {
                    return "ID";
                }
                return name;
            }
        };

        String text = "{\"id\":123,\"name\":\"WJH\"}";

        Object object = JSON.parse(text);

        SerializeWriter out = new SerializeWriter();
        JSONSerializer serializer = new JSONSerializer(out);
        serializer.getValueFilters().add(filter);
        serializer.getNameFilters().add(nameFilter);

        serializer.write(object);

        String outText = out.toString();
        System.out.println(outText);
    }

2.5、demo5, @JSONField 使用

    public static class User {

        private int    id;
        private String name;

        @JSONField(name = "uid")
        public int getId() { return id; }

        @JSONField(name = "uid")
        public void setId(int id) { this.id = id; }

        public String getName() { return name; }

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

    /**
     * {"name":"毛頭","uid":123}
     * @throws Exception
     */
    public void test_0() throws Exception {
        User user = new User();
        user.setId(123);
        user.setName("毛頭");

        String text = JSON.toJSONString(user);
        Assert.assertEquals("{\"name\":\"毛頭\",\"uid\":123}", text);
        System.out.println(text);
    }

2.6、demo 6

/**
 * {"name":"張三","id":123}
 * {name=張三, id=123}
 */
public class MapDemo extends TestCase {
    public void test_0 () throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("id", 123);
        map.put("name", "張三");
        
        String text = JSON.toJSONString(map);
        System.out.println(text);
        System.out.println(map.toString());
    }
}

2.7、DefaultJSONParser

    public void test_reuse() throws Exception {
        Model model = new Model();

        {
            DefaultJSONParser parser = new DefaultJSONParser("{\"id\":123,\"name\":\"wangsai-silence\"}");
            parser.parseObject(model);
            parser.close(); // 調用close能重用buf,提升性能

            assertEquals(123, model.id);
            assertEquals("wangsai-silence", model.name);
        }

        {
            DefaultJSONParser parser = new DefaultJSONParser("{\"id\":234,\"name\":\"wenshao\"}");
            parser.parseObject(model);
            parser.close(); // 調用close能重用buf,提升性能

            assertEquals(234, model.id);
            assertEquals("wenshao", model.name);
        }
    }

    public static class Model {
        public int id;
        public String name;
    }

2.8、從文件中解析

    public void test_for_maiksagill() throws Exception {
        String resource = "json/maiksagill.json";
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
        String text = IOUtils.toString(is);

        System.out.println(text);
        JSON.parseObject(text, WareHouseInfo[].class);
    }     

2.9、Null 處理

public void test_boolean() throws Exception {
        Model model = new Model();
//        String json = JSON.toJSONString(model, SerializerFeature.IgnoreNonFieldGetter); //{}
        String json = JSON.toJSONString(model,SerializerFeature.WriteNullStringAsEmpty); // {"available":true,"name":""}
//        String json = JSON.toJSONString(model,SerializerFeature.WriteMapNullValue); // {"age":null,"available":true,"name":null}
        System.out.println(json);
    }

    public static class Model {
        private String name;
        private Long age;

        public String getName() {
            return name;
        }

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

        public Long getAge() {
            return age;
        }

        public void setAge(Long age) {
            this.age = age;
        }

        public boolean isAvailable() {
            return true;
        }
    }

簡單列出這麼多,其實 FastJson還是很強大的,比Gson ,Jackson 豐富很多序列化的實現

三、Gson

這裏可參考這裏,鏈接

四、Jackson

Jackson是框架設計中首選的,是可以肯定的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章