2015-08-24 59 views
3

我使用Volley Library來獲取JSON響應請求。我創建了基本http幫助程序類,它處理請求並返回JSON以供下一次處理。Android:將JSON轉換爲POJO是否正確?

我想問什麼是正確的方法來處理返回的JSON數據?

我想用數據顯示在ListViewView等,但我不知道什麼是正確的做法(轉換爲POJO或者將數據保存在JSON?)

我試圖找到任何關於此主題的解決方案: Json to POJO mapping in Android

但似乎每個對象都應該有一個具有對象所有可能字段定義的類。

這種方法對我來說似乎很奇怪,因爲我已經爲數據庫對象創建了模型,並且如果JSON對象被更改(例如添加了新屬性或更改了名稱),這意味着API模型上的代碼也應該更改。

是否有任何其他的可能性和正確的方法如何避免這種情況,並只處理活動(控制器)返回的數據?

+0

你可以重複使用json模型在db或db模型中使用json – KOTIOS

+0

它們的結構是非常不同的,並不是所有的JSON實體在DB模型中都是相同的。我不認爲將DB模型與JSON實體混合是一個好主意,因爲我認爲這會導致應用程序邏輯混亂。 – redrom

+0

爲兩者創建不同的pojo並沒有什麼壞處,或者如果是小的diffrance,那麼你可以使用非json關鍵字的臨時keywork – KOTIOS

回答

1

使用GSON它是相當活潑和易於使用。例如,

Gson gson = new Gson(); // Or use new GsonBuilder().create(); 
MyType target = new MyType(); 
String json = gson.toJson(target); // serializes target to Json 
MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2 
1

完全閱讀我的答案,我已經用簡單的方式解釋了。

首先,如果您使用Volley不需要http helper類,請使用Volley的方法通過對象或數組獲取JSON數據。

第二個POJO類最好用它。是的,這是正確的做法。

這裏是獲取JSON對象數據的源代碼,它們是從POJO中抽出和存儲的。

/** * 方法,使JSON對象請求,其中JSON響應開始wtih { * */ 私人無效makeJsonObjectRequest(){

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET, 
     "http://api.example.com", null, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       Log.d(TAG, response.toString()); 

       try { 
        // Parsing json object response 
        // response will be a json object 
        String name = response.getString("name"); 
        String email = response.getString("email"); 

        //POJO class to store 
        Person person = new Person(); 
        person.name=name; 
        person.email=email;       

       } catch (JSONException e) { 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), 
          "Error: " + e.getMessage(), 
          Toast.LENGTH_LONG).show(); 
       } 
       hidepDialog(); 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       Toast.makeText(getApplicationContext(), 
         error.getMessage(), Toast.LENGTH_SHORT).show(); 
       // hide the progress dialog 
       hidepDialog(); 
      } 
     }); 

// Adding request to request queue 
AppController.getInstance().addToRequestQueue(jsonObjReq); 

}

+0

我會將解析邏輯從onResponse移開,因爲此方法在主線程上執行。 –

+0

這只是一個小例子,所以我把解析邏輯放在那裏 –

0

我肯定會建議你變換JSON到POJO並使用它。使用對象來表示面嚮對象語言(如Java)中的數據更自然。

我想問什麼是處理返回的JSON數據的正確方法?

主要有兩種選擇:

  1. 使用內置 - 在JSON SDK - 這是一個非常不錯的工具,是充分的,如果你沒有複雜的響應結構。它可以是相當高性能的。
  2. 使用某種第三方JSON處理庫 - GSON或Jackson。它們具有功能性,例如基於註釋等從JSON到POJO的自動反序列化,這可以節省您的時間,但它很昂貴。爲了獲得最佳性能,您仍然應該手動解析這些事情,但只有在需要優化時纔可以開始執行此操作。

無論您使用什麼,只要確保JSON處理在工作線程上完成。如果你正在使用Volley,你應該考慮擴展一個Request類並且重載parseNetworkResponse() - 這是插入你的反序列化的好地方。該答覆現在是POJO和你可以用它們來填充列表等

至於這個雲:因爲我已經創建模型的數據庫對象和

這種做法在我看來奇怪如果JSON對象發生變化(例如添加新屬性或更改名稱),這意味着API模型上的代碼也應該更改。

不幸的是,你是對的。但這是客戶端 - 服務器通信中的常見問題。在HTTP上使用JSON時,無法強制遵守服務器和客戶端之間的協議。你可以做的最好的,恕我直言,是檢測可能的例外,並相應地處理它們 - 向用戶顯示一條消息,或類似的東西。您始終可以使用Maps將反序列化的有效內容保存爲鍵 - 值對,但這並不能真正解決問題,但可確保反序列化邏輯不會失敗。