网络解析基础篇:
网络解析百分之八十多是用的Json作为数据格式,也有个别使用xml,那么今天就用json来做网络交互,我们自己手工去解json的话会很繁琐,那么我们一般会借助反射机制,来反射Bean中的属性,吧json属性的key跟属性名equals就行。没错,,有人会知道,这就是google的Gson包所做的事情,那么我们就借助Gson来做个简易的网络交互。
这里,我就不写反射代码了,直接下载Gson,使用Gson现成提供的方法来实现:
为大家找了一个0分下载的Gson 2.3.1 :http://download.youkuaiyun.com/detail/zxyyxzzxy004/8206489
这里以get方法为例:
public class NetConnector {
public static final int SUCCESS = 0;
public static final int ERROR = -1;
private static HttpClient client = new DefaultHttpClient();
private static AsyncHttpClient asyncClient = new AsyncHttpClient();
public static void doGet(String url, HashMap<String,String> params,Class<?> clazz, Handler handler) {
Message msg = Message.obtain();
String currUrl = handleGetUrl(url, params);
try {
HttpGet get = new HttpGet(currUrl);
HttpResponse responce = client.execute(get);
if (responce.getStatusLine().getStatusCode() == 200) {
String jsonStr = EntityUtils.toString(responce.getEntity(),
"UTF-8");
Gson gson = new Gson();
TypeToken<?> token = TypeToken.get(clazz);
msg.obj = gson.fromJson(jsonStr, token.getType());
msg.what = SUCCESS;
handler.sendMessage(msg);
} else {
msg.what = ERROR;
msg.obj = "获取服务器数据失败,请稍后重试!";
handler.sendMessage(msg);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
msg.what = ERROR;
msg.obj = "访问服务器失败!";
handler.sendMessage(msg);
} catch (SocketTimeoutException e) {
e.printStackTrace();
msg.what = ERROR;
msg.obj = "连接服务器超时!";
handler.sendMessage(msg);
} catch (ConnectTimeoutException e) {
e.printStackTrace();
msg.what = ERROR;
msg.obj = "连接服务器超时!";
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
msg.what = ERROR;
msg.obj = "数据获取失败!";
handler.sendMessage(msg);
}
}
}
handleGetUrl方法:
private static String handleGetUrl(String url,HashMap<String,String> params){
StringBuffer sBuffer = new StringBuffer(url);
if(!url.endsWith("?"))
sBuffer.append("?");
int i = 0;
for (String key : params.keySet()) {
String value = params.get(key);
sBuffer.append(key+"="+value);
if(!(i==params.size()-1))
sBuffer.append("&");
i++;
}
return sBuffer.toString();
}
我来解释下:
先看一段Json:
{
"state":"200",
"msg":"成功",
"time":"2015-8-4 15:59",
"result":{
token:"347f296f3f0f4f1753c6cea42c5ecc70", //key
id:"11", //id
username:"18910416762", //账号
nickname:"张三", //昵称
headimg:"1.jpg", //头像
mobile:"13456543423", //手机号
password:"347f296f3f0f4f1753c6cea42c5ecc70" //密码
}
}
4个参数,
String url,//接口地址
HashMap<String,String> params//参数列表
,Class<?> clazz,//将要回递给你的Bean对象,这是核心,Gson将反射它。来解析Json中的数据,然后一一对应进行赋值,这里重点解释这个。。Gson有个规范
// 如果想通过Gson解析,那么必须按照它的规范来,那么我来简单解释下这个规范,例如:
/*
package com.angelonline.obj;
import java.io.Serializable;
public class LoginObj implements Serializable{
private static final long serialVersionUID = 5018899594211061547L;
private String token = "";//:"347f296f3f0f4f1753c6cea42c5ecc70", //key
private String id = "";//:"11", //id
private String username = "";//:"18910416762", //账号
private String nickname = "";//:"张三", //昵称
private String headimg = "";//:"1.jpg", //头像
private String mobile = "";//:"13456543423", //手机号
private String password = "";//:"347f296f3f0f4f1753c6cea42c5ecc70" //密码
public LoginObj(){}
public LoginObj(String token,String id,String username,String nickname,String headimg,String mobile,String password){
this.token = token;
this.id = id;
this.username = username;
this.nickname = nickname;
this.headimg = headimg;
this.mobile = mobile;
this.password = password;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getHeadimg() {
return headimg;
}
public void setHeadimg(String headimg) {
this.headimg = headimg;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
*/
Handler handler//回调
解释的有点笼统,具体了解请见Gson解析,去google官方或者百度更多demo。
说明下,如果服务器没有返回对应的值,那么将对应的key将是默认赋给null,
如果发现爆Google。xxx。xxx或者Gson.xxx.xxx等Exception,不要着急,耐心的慢慢排查你的bean,
八成是bean的结构不规范。照着上面的例子,调整下结构就行,,
Post方法同理,只要获取到Json,剩下部分完全可以原样copy!
大神勿喷!纯属简单介绍一个简单的网络交互!