OKHttp與GSON獲取JSON資料
這段時間看blog,到處都是OKHttp,簡直就是高效、簡潔的HTTP程式設計的代名詞,火過Volley,今天就來講講在專案使用中比較常見的獲取JSON資料的例項。對JSON資料的處理,在以前的android中貌似有點小麻煩,需要用到java的反射機制,對於新手來說是比較麻煩的,好在現在有google的GSON和阿里的fastjson可以選擇,本文例項選擇GSON,進行處理。
首先需要下載OKHTTP和GSON的jar包,OKHTTP還用到了okio,也需要下載相應的jar包,這些jar包網上搜尋一下有很多下載連結的,這裡不再累述,不願搜尋的可以點選下列連結。
OKHTTP:
OKIO:下載地址
有下列JSON資料
{"version":2,"data":[{"id":1,"remark":"1","appname":"UC瀏覽器","appcontent":"1","apppackagename":"com.UCMobile"}
,{"id":2,"remark":null,"appname":"支付寶","appcontent":null,"apppackagename":"com.alipay.android.app"}
,{"id":3,"remark":null,"appname":"WPS","appcontent":null,"apppackagename":"cn.wps.moffice_eng"}],"msg":"獲取資訊列表成功"}
存放在本地服務中,url為http://192.168.10.133:8080/getAppInfor
檢視json資料,有下列關鍵詞:version,data,msg。data中有id,remark,appname,appcontent,apppackagename
新建兩個資料類,分別對應相應的選項
public class ApkInfo { private String apppackagename; private Integer id; private String appname; private String appcontent; private String remark; public String getApppackagename() { return apppackagename; } public void setApppackagename(String apppackagename) { this.apppackagename = apppackagename; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAppname() { return appname; } public void setAppname(String appname) { this.appname = appname; } public String getAppcontent() { return appcontent; } public void setAppcontent(String appcontent) { this.appcontent = appcontent; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return "ApkInfo [id=" + id + ", remarm=" + remark + ", appname=" + appname + ", appcontent=" + appcontent + ", apppackagename=" + apppackagename + "]"; } }
public class PackageListInfo {
private String msg;
private String version;
private List<Object> data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public List<Object> getData() {
return data;
}
public void setData(List<Object> data) {
this.data = data;
}
@Override
public String toString() {
return "PackageListInfo [version=" + version + ", data=" + data + ", msg=" + msg
+ "]";
}
}
需要注意的是,類中的變數名必須與JSON資料中的關鍵詞要一樣。
新建一個OKHTTP的管理類get得到JSON資料,並進行處理。
import android.util.Log;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class GetApkPackage {
public static String apkPackageUrl = http://192.168.10.133:8080/getAppInfor;
public static GetApkPackage install = new GetApkPackage();
public static ArrayList<String> appList=new ArrayList<String>();
public void getPackage() {
OkHttpClient mOkHttpClient = new OkHttpClient();
final Request request = new Request.Builder().url(apkPackageUrl).build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println("獲取apk列表失敗");
Log.d("GetApkPackage", e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
System.out.println(result);
//InputStream is = response.body().byteStream();
//byte[] bytes = response.body().bytes();
Gson gson = new Gson();
PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class);
System.out.println(packlist.getData().toString());
List<ApkInfo> apkList = new ArrayList<ApkInfo>();
Type type = new TypeToken<ArrayList<ApkInfo>>() {}.getType();
apkList = gson.fromJson(packlist.getData().toString(), type);
/*
Map<String,ApkInfo> apkList = gson.fromJson(packlist.getData().toString(),
new TypeToken<List<ApkInfo>>() {
}.getType());
*/
if(apkList == null){
System.out.println("apkpackage列表為空");
return;
}
for(int i =0;i<apkList.size();i++){
String apkName = apkList.get(i).getApppackagename();
System.out.println(apkName);
appList.add(apkName);
}
}
});
}
public static GetApkPackage getInstall(){
return install;
}
}
上述程式碼中,對JSON資料的處理看起來很簡單,只要new一個GSON例項,然後通過gson.fromJson方法,就能夠得到json資料
Gson gson = new Gson();
PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class);
OKHTTP傳送一個字串給伺服器的例項如下:
public final class PostString {
public static final MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse("text/x-markdown; charset=utf-8");
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
String postBody = ""
+ "Releases\n"
+ "--------\n"
+ "\n"
+ " * _1.0_ May 6, 2016\n"
+ " * _1.1_ June 15, 2016\n"
+ " * _1.2_ August 11, 2016\n";
Request request = new Request.Builder()
.url("https://192.168.10.133:8080/base")
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
public static void main(String... args) throws Exception {
new PostString().run();
}
}