最近和同学做一个app涉及到联网获取服务器信息,做法是服务器访问数据库操作,获取到数据库中信息,封装成json格式数据,服务器端用的json-lib,json封装起来很方便
JSONArray jsonArray = JSONArray.fromObject(anList);
response.getWriter().write(jsonArray.toString());
两句话就能搞定。然而也是android用的是自带的json,就没有那么好用的api了只能自己new对象,然后慢慢解析,中间碰到很多坑,也是自己不注意,就像下面的这个困扰了我好几天,result里边是服务器端传过来的数据,String格式,然后json数据格式很复杂,说一下最容易出错的地方,就是对象定义的地方,像下边的for循环里面要复用的对象要在for循环里面new,如果在外边new,每次for都是操作同一个对象,最后list.add(obj);得到的list就会出错,特别是在下面这种多层for循环,对象的定义就更容易出问题了,出了问题真的是超难找出来,教训就是最好没有完全的必要不要传这么复杂的json,把所有必要的信息可以封装成一个新的对象再传。
public void init() {
url = Tool.ip + Tool.webName + "ShowinfoServlet?user_id="+userDataOp.getuser_id();
new AsyncTask<String, Void, String>() {
@Override
protected String doInBackground(String... params) {
try {
httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = httpClient.execute(httpGet);
String value = EntityUtils.toString(response.getEntity());
return value;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
JSONObject json = new JSONObject();
JSONObject json1 = new JSONObject();
JSONObject json2 = new JSONObject();
try {
JSONArray ja1 = new JSONArray(result);
for(int i=0;i<ja1.length();i++){
ArrayList<Announce> announceList = new ArrayList<Announce>();
json = ja1.getJSONObject(i);
UserOrganize uo = new UserOrganize();
uo.setOrganize_id(json.getString("organize_id"));
uo.setUo_id(Integer.parseInt(json.getString("uo_id")));
uo.setUo_type(Integer.parseInt(json.getString("uo_type")));
uo.setUser_id(json.getString("user_id"));
json1 = json.getJSONObject("organize");
Organize organize = new Organize();
organize.setOrganize_id(json1.getString("organize_id"));
organize.setOrganize_img(json1.getString("organize_img"));
organize.setOrganize_money(json1.getString("organize_money"));
organize.setOrganize_note(json1.getString("organize_note"));
JSONArray ja3 = json1.getJSONArray("announce");
for (int k = 0; k < ja3.length(); k++) {
json2 = ja3.getJSONObject(k);
Announce announce = new Announce();
announce.setAn_id(Integer.parseInt(json2.getString("an_id")));
announce.setAn_time(json2.getString("an_time"));
announce.setAn_content(json2.getString("an_content"));
announce.setOrganize_id(json2.getString("organize_id"));
announceList.add(announce);
}
organize.setAnnounce(announceList);
uo.setOrganize(organize);
uoList.add(uo);
}
} catch (Exception e) {
e.printStackTrace();
}
lv_an.setAdapter(new MyAdapter());
}
}.execute(url);
}
然后,网络传送格式,就是上边代码描述的,使用AsyncTask,doInBackground方法里边是固定的get提交http请求,onPostExecute方法则是处理服务器返回的数据。因为项目网络操作都不复杂,所以统一使用get提交请求,直接将参数写在url,会很方便,doInBackground方法里边的代码也不用改变。最后使用android studio使用org.apache.http的包是需要自己下载jar包手动并导入的。