為公司做了小任務,需要用到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