2016-04-07 39 views
1

我想通過Volley向我的WCF服務發出GET請求,我想解析它對Java ArrayList的響應。這裏是我的方法Android Parse Json響應Java ArrayList

public ArrayList<Company> getCompanies(){ 

     String url = AUDITTRACKINGAPP_SERVICE_URI + "GetCompanies"; 
     String tagJsonReq = "companiesRequest"; 

     final ProgressDialog pDialog = new ProgressDialog(context); 
     pDialog.setMessage("Please Wait..."); 
     pDialog.show(); 

     final ArrayList<Company> companies = new ArrayList<Company>(); 

     JsonObjectRequest companiesRequest = new JsonObjectRequest( Request.Method.GET, url, null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 

         Log.v(TAG, "COMPANIES RESPONSE:" + response.toString()); 

         try { 
          JSONArray companiesJson = response.getJSONArray("GetCompaniesResult"); 

          for (int i = 0; i < companiesJson.length(); i++) { 

           JSONObject jObject = (JSONObject)companiesJson.get(i); 

           Company company = new Company(); 
           company.setCompanyId(Integer.parseInt(jObject.getString("CompanyId"))); 
           Log.v(TAG, "COMPANIES setCompanyId:" + jObject.getString("CompanyId")); 
           company.setCompanyName(jObject.getString("CompanyName")); 
           Log.v(TAG, "COMPANIES setCompanyName:" + jObject.getString("CompanyName")); 

           companies.add(company); 
          } 

         } catch (JSONException e) { 
          Log.v(TAG, "COMPANIES RESPONSE ERROR ON PARSING JSON:" + e.getMessage()); 
         } 

         pDialog.hide(); 
        } 
       }, 
       new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.v(TAG, "COMPANIES onErrorResponse:" + error.getMessage()); 
        pDialog.hide(); 
       } 
      }); 

    AppController.getInstance().addToRequestQueue(companiesRequest, tagJsonReq); 

    return companies; 
} 

JSON響應:

{"GetCompaniesResult":[{"CompanyId":1,"CompanyName":"CompanyName1"},{"CompanyId":2,"CompanyName":"CompanyName2"}]} 

我能夠得到JSON響應,但ArrayList<Company>返回null。我認爲onResponse是一個回調方法,並在另一個線程運行,所以我不能填充列表,但因爲我是Android新手我不知道如何管理這個問題。任何幫助,將不勝感激。

+1

你會得到輸出日誌? –

+0

是的,我看到JSON響應@AiyazParmar – Tartar

+0

是你的for循環執行成功嗎? –

回答

0

JsonObjectRequest工程異步因爲主線程繼續運行,並且創建一個新的線程來運行JsonObjectRequest,結果是您的返回值爲null。在類中調用一個方法將數據發回,並調用它,當你完成管理JSON數據,例如:

public void manageCompaniesData(ArrayList<Company>){ 

    //YOUR CODE HERE. 

} 

您的代碼修改:

public ArrayList<Company> getCompanies(){ 

String url = AUDITTRACKINGAPP_SERVICE_URI + "GetCompanies"; 
     String tagJsonReq = "companiesRequest"; 

     final ProgressDialog pDialog = new ProgressDialog(context); 
     pDialog.setMessage("Please Wait..."); 
     pDialog.show(); 

     final ArrayList<Company> companies = new ArrayList<Company>(); 

     JsonObjectRequest companiesRequest = new JsonObjectRequest( Request.Method.GET, url, null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 

         Log.v(TAG, "COMPANIES RESPONSE:" + response.toString()); 

         try { 
          JSONArray companiesJson = response.getJSONArray("GetCompaniesResult"); 

          for (int i = 0; i < companiesJson.length(); i++) { 

           JSONObject jObject = (JSONObject)companiesJson.get(i); 

           Company company = new Company(); 
           company.setCompanyId(Integer.parseInt(jObject.getString("CompanyId"))); 
           Log.v(TAG, "COMPANIES setCompanyId:" + jObject.getString("CompanyId")); 
           company.setCompanyName(jObject.getString("CompanyName")); 
           Log.v(TAG, "COMPANIES setCompanyName:" + jObject.getString("CompanyName")); 

           companies.add(company); 
          } 

         } catch (JSONException e) { 
          Log.v(TAG, "COMPANIES RESPONSE ERROR ON PARSING JSON:" + e.getMessage()); 
         } 
         manageCompaniesData(companies); 
         pDialog.hide(); 
        } 
       }, 
       new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.v(TAG, "COMPANIES onErrorResponse:" + error.getMessage()); 
        pDialog.hide(); 
       } 
      }); 

    AppController.getInstance().addToRequestQueue(companiesRequest, tagJsonReq); 

    } 
+0

這就是爲什麼他會傳遞一個迴應。監聽器的調用,爲了管理異步響應 –

+0

但是這個監聽器是在其他線程 –

+0

onResponse()總是在UI線程上運行 –

-1

,如果你在任何JSON異常logcat,試試這個。

for (int i = 0; i < companiesJson.length(); i++) { 

          JSONObject jObject = companiesJson.getJSONObject(i); 
          Company company = new Company(); 
          company.setCompanyId(Integer.parseInt(jObject.getString("CompanyId"))); 
          Log.v(TAG, "COMPANIES setCompanyId:" + jObject.getString("CompanyId")); 
          company.setCompanyName(jObject.getString("CompanyName")); 
          Log.v(TAG, "COMPANIES setCompanyName:" + jObject.getString("CompanyName")); 
          companies.add(company); 
} 
+0

你甚至讀過這個問題嗎? – Tartar

+0

你會得到「Log.v(TAG,」COMPANIES setCompanyId:「+ jObject.getString(」CompanyId「));」在logcat。 –

+0

是的,請閱讀這個問題。 – Tartar

0

JSONArray對象有一個函數getJSONObject(int index)所以你必須使用

JSONObject jObject = companiesJson.getJSONObject(i); 

代替

JSONObject jObject = (JSONObject)companiesJson.get(i); 

試試這個代碼。

for (int i = 0; i < companiesJson.length(); i++) { 
    JSONObject jObject = companiesJson.getJSONObject(i); 
    Company company = new Company(); 
    company.setCompanyId(jObject.getInt("CompanyId"))); 
    company.setCompanyName(jObject.getString("CompanyName")); 
    companies.add(company); 
} 

代替

for (int i = 0; i < companiesJson.length(); i++) { 
    JSONObject jObject = (JSONObject)companiesJson.get(i); 
    Company company = new Company(); 
    company.setCompanyId(Integer.parseInt(jObject.getString("CompanyId"))); 
    Log.v(TAG, "COMPANIES setCompanyId:" + jObject.getString("CompanyId")); 
    company.setCompanyName(jObject.getString("CompanyName")); 
    Log.v(TAG, "COMPANIES setCompanyName:" + jObject.getString("CompanyName")); 

    companies.add(company); 
} 
5

您需要創建JSON數組中的每個元素

try { 
          JSONArray companiesJson = response.getJSONArray("GetCompaniesResult"); 

          for (int i = 0; i < companiesJson.length(); i++) { 


        JSONObject obj = Website.getJSONObject(i); 


           Company company = new Company(); 
           company.setCompanyId(Integer.parseInt(obj.getString("CompanyId"))); 
           Log.v(TAG, "COMPANIES setCompanyId:" + obj.getString("CompanyId")); 
           company.setCompanyName(obj.getString("CompanyName")); 
           Log.v(TAG, "COMPANIES setCompanyName:" + obj.getString("CompanyName")); 

           companies.add(company); 
          } 

         } catch (JSONException e) { 
          Log.v(TAG, "COMPANIES RESPONSE ERROR ON PARSING JSON:" + e.getMessage()); 
         } 
+0

他已經這樣做了:JSONObject jObject =(JSONObject)companiesJson.get(i); –

0

解析您的JSON這樣的for內的JSON對象loop.Also不要聲明ArrayList公司爲final

Company company = new Company(); 
JSONObject jObject = (JSONObject)companiesJson.optJSONObject(i); 
if(jObject != null){ 
    company.setCompanyId(jObject.optInt("CompanyId"))); 
    company.setCompanyName(jObject.optString("CompanyName")); 
}