本项目需要发送请求接受json文件并解析他。
我们使用的是HttpClient类来发送url。HttpClient需要一个额外的包。下载地址
发送
发送接收文件是一种耗时的行为,所以不能放在主线程中使用。
new Thread(new Runnable() {
@Override
public void run() {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse result = httpClient.execute(httpGet);
if (result.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = result.getEntity();
String response = EntityUtils.toString(entity, "utf-8");
Message message = new Message();
message.what = SHOW_JSON;
message.obj = response.toString();
handler.sendMessage(message);
} else {
Thread.interrupted();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
new HttpClient和HttpGet。同时将url发送出去。里面带有信息所以就不用post而用get,这样直接接受信息。
HttpResponse result = httpClient.execute(httpGet);
new完之后需要执行。使用execute语句,返回HttpResponse对象。
如果返回的result的状态值为200,则表示发送返回成功。
返回的内容存在HttpEntity中。 使用String response = EntityUtils.toString(entity, “utf-8”);将其变成字符串。因为内容有中文,使用utf-8编码。
之后就是解析json了。因为解析也是需要时间,所以我们将信息打包放在message中,再在主线程的handler的handleMessage中处理。
解析JSON
解析JSON可以用自带的JsonObject,我这次用的是gson,下载也在上面的下载地址那里。
gson比json方便的一点就在于他比较自动。只要将json中的结构抽象出来成一个类就可以直接解析。
比如
我们将他抽象JSONBean类
package com.example.getgradedemo;
import java.util.List;
import com.google.gson.Gson;
class Grade{
String name;
String credit;
String gpa;
String score;
String rank;
Grade(String name,String credit,String gpa,String grade,String rank){
this.name=name;
this.credit=credit;
this.gpa=gpa;
this.score=grade;
this.rank=rank;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCredit() {
return credit;
}
public void setCredit(String credit) {
this.credit = credit;
}
public String getGpa() {
return gpa;
}
public void setGpa(String gpa) {
this.gpa = gpa;
}
public String getScore() {
return score;
}
public void setScore(String grade) {
this.score = grade;
}
public String getRank() {
return rank;
}
public void setRank(String rank) {
this.rank = rank;
}
}
public class JSONBean {
public String success;
public String msg;
public String code;
public List<Grade> content;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getSuccess() {
return success;
}
public void setSuccess(String success) {
this.success = success;
}
public List<Grade> getContent() {
return content;
}
public void setContent(List<Grade> content) {
this.content = content;
}
}
接下来解析json
public void parseJSON(String jsonData) {
Gson gson = new Gson();
JSONBean jb=gson.fromJson(jsonData,JSONBean.class);
if (jb.success.equals("true")) {
tableLayout.setVisibility(View.VISIBLE);
List<Grade> lists = jb.content;
for (Grade g : lists) {
TableRow tableRow = new TableRow(this);
TextView name = new TextView(this);
TextView credit=new TextView(this);
TextView grade=new TextView(this);
TextView rank=new TextView(this);
TextView gpa=new TextView(this);
name.setSingleLine(false);
name.setWidth(200);
credit.setSingleLine(false);
grade.setSingleLine(false);
rank.setSingleLine(false);
gpa.setSingleLine(false);
tableRow.removeAllViews();
name.setText(g.getName());
tableRow.addView(name);
credit.setText(g.getCredit());
tableRow.addView(credit);
grade.setText(g.getScore());
tableRow.addView(grade);
gpa.setText(g.getGpa());
tableRow.addView(gpa);
rank.setText(g.getRank());
tableRow.addView(rank);
tableLayout.addView(tableRow,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
} else {
Toast.makeText(this, jb.msg, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, GetGradeActivity.class);
startActivity(intent);
}
}
Gson gson = new Gson();
JSONBean jb=gson.fromJson(jsonData,JSONBean.class);
注意我们的json里面最外层不是数组,所以返回的是个对象,如果是数组则存在List<JSONBean>
中。然后通过键值对形式将其取出。