[英]Android Parse Json Response To Java ArrayList
我正在尝试通过Volley向我的WCF服务发出GET请求,并且我想解析其对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新手,所以我不知道如何管理此问题。 任何帮助,将不胜感激。
您需要为json数组的每个元素创建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());
}
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);
}
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);
}
在for
循环内像这样解析json。也不要将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"));
}
如果您想为CompanyID和CompanyName设置json值,请尝试以下代码段。 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);
如果您在logcat中收到任何JSON异常,请尝试一次。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.