2016-04-07 42 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")); 
}