[HTTP那些事] JSON資料,http那些事json資料
隨著Android的發展,各路大神的貢獻,我們可用的輪子越來越多。比如HTTP請求架構,有自家的Volley,Square的okhttp, async-http-lib, 還有彙總版的xUtils以及AFinal。我想你肯定用過其中一個。
當然Stay今天不是來科普的,而是來跟大家一起思考一個問題的。我們暫且不提他們在內部做了多少最佳化,我們就說lib的返回資料。
在常用的http請求的傳回值中,檔案,JSON占絕大多數(圖片有其他架構,這裡不考慮)。檔案下載都有專門的response,會幫你下載到制定路徑,這個肯定都支援。那JSON呢?貌似都返回一個JSONObject或者JSONArray。
我去,做好事得做全啊,返回JSONObject是個什麼鬼,難道還得自己動手寫解析還原序列化成自己要得對象?那是最低級的程式員乾的事。好在我們都不傻,還有GSON,fastJson,Jackson幫我們來完成這步轉化。
比方說伺服器返回的資料:(雙引號沒加,佔位置,別噴)
{name:stay, age:17, job:soho}
對應的對象:
Class User{ public String name, public int age, public String job}
好,那我們只需要在response回調時拿到result,調用json-lib還原序列化就可以了,比如這樣:
User user = gson.fromJson(result, User.class)
現在我們就可以使用user對象來更新UI了對吧。就多了一行代碼,沒強迫症的也就忍過去了。
接下來我們再看下面一種json資料:
{resCode:200, data:{name:Stay, age:17, job:soho}, msg:success}{resCode:401, data:{}, msg:token invalid}
我去,這是什麼鬼,不好好遵守http協議,統一返回200是什麼鬼,token不合法給我返回401 error code不好嗎。。別說,很多公司都這麼定義返回資料的
這樣我們怎麼辦。。多寫一步解析咯。
JSONObject json = new JSONObject(result)JSONObject data = json.optJSONObject("data")if(data != null){ User user = gson.fromJson(data.toString(), User.class)}
天啊,即使沒強迫症,大概也會受不了每個API請求都寫這麼多代碼了吧。
BB了這麼多,大家應該懂我想表達什麼了吧?
為什麼不直接將json轉換成我們要的對象User再回調呢?
而且在json資料大的情況下,還原序列化還是耗時操作,有可能會卡UI的好嗎。
這可能嗎?當然可以,不然Stay鋪墊這麼多幹嘛。不過在Stay說解決方案之前,大家可以試著自己考慮下實現。
-
我們拿到的是String,格式是JSON
-
每次拿到JSON String,我們都來做了一步還原序列化對象操作
-
gson.fromJson需要兩個參數(String JSON,Class dest)
-
回調參數得變成onResponse(User user)
-
架構層得知道Class dest
如果能把這些事情想清楚,你就可以很順利得擴充那些開源架構了,以後你也再不用手寫json解析了。
就說這麼多,留點時間給大家自己思考下,下面再說解決方案