Jackson Gson Json.simple 比較

weixin_34391854發表於2014-11-20

為公司做了小任務,需要用到Java Json庫,Json庫我幾個月之前就用過,不過那時候是跟著專案來的,延續了專案的使用習慣直接用了jackson Json,而這次我覺得好好比較一下幾個常見的Json庫,然後選一個最快的。

 

看了幾篇blog,覺得其實可選的就三種,jackson, gson, json.simple。我最初用了json.simple,然後寫出來了這樣的函式

從URL中讀取Json資料,並且在Request中新增身份資訊

    public static JSONObject readJsonFromUrl(String url, String token) {
        try {
            URLConnection conn = new URL(url).openConnection();
            conn.setRequestProperty("Authorization", "Bearer " + token);
            InputStream response = conn.getInputStream();

            String JsonStr = IOUtils.toString(response);
            JSONObject jsonObj = (JSONObject)JSONValue.parseWithException(JsonStr);
//            System.out.println(jsonObj);
            return jsonObj;

        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

然後,抽取Json中的資料

    public static Reply parseJson(JSONObject jsonObj) {
        Reply reply = new Reply(jsonObj.get("next_stream_position").toString());

        JSONArray jsonAry = (JSONArray)(jsonObj.get("entries"));

        for(int i = 0; i < jsonAry.size(); i ++) {
            JSONObject iObj = (JSONObject)jsonAry.get(i);
            reply.addIPAddr(iObj.get("ip_address").toString());
        }
        return reply;
    }

 

寫完之後,我覺得有必要將Json替換成更加高效的實現,於是我打算從Jackson, Gson中挑一種使用

Jackson適合處理大量的資料,Gson適合處理小些的資料,並且Gson的jar包比其他選擇小了很多,給我一種很輕巧的感覺。

此外,我很不情願為Json資料寫一個POJO,因為我只要這個POJO中的一兩個成員變數。Jackson不僅要這個POJO,還需要在這個POJO上加上annotation,所以我直接把它排除了。

Gson,google的產品,給我一種可以信賴的感覺。於是我寫出了這樣的程式碼

    public static Reply readJsonFromUrl(String url, String token) {
        Reply reply = new Reply();
        try {
            URLConnection conn = new URL(url).openConnection();
            conn.setRequestProperty("Authorization", "Bearer " + token);
            InputStream response = conn.getInputStream();
            JsonReader reader = new JsonReader(new InputStreamReader(response, "UTF-8"));

            // only one element will be returned
            // parse data recursively
            // google's way to handle streaming data, ugly though
            reader.beginObject();
            reader.beginObject();
            while(reader.hasNext()) {
                String name = reader.nextName();
                if(name.equals("next_stream_position"))
                    reply.stream_position = reader.nextString();
                else if(name.equals("entries")) {
                    reader.beginArray();
                    while(reader.hasNext()) {
                        reader.beginObject();
                        while(reader.hasNext()) {
                            name = reader.nextName();
                            if(name.equals("ip_address"))
                                reply.addIPAddr(reader.nextString());
                            else if(name.equals("created_at"))
                                reply.lastDate = reader.nextString();
                            else
                                reader.skipValue();
                        }
                        reader.endObject();

                    }
                    reader.endArray();
                } else
                    reader.skipValue();
            }
            reader.endObject();
            reader.close();
            return reply;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

由於需要處理流式資料且不願意寫POJO,最終就寫成了上面這一坨醜陋不堪的程式碼,我想這下效率倒是可以保證了。

 

寫完程式碼後我想了下,覺得最合適的Json庫應該還是Json.simple,它的轉換簡單,可以直接根據String get到想要的那一個資訊,且最重要的是程式碼寫的短,實現的效率高。在企業,在學校,在面臨交差的任何地方,用最短的時間完成任務才是最重要的,這一點我已深有體會。

 

Well,以後預設用Json.simple

相關文章