使用Volley和Gson來處理Json
暗黑3的API傳遞給我們的是一個Json數據。現在開始我們嘗試來解析它。在百度了一下之后,我初步知道了2個工具。一個是Volley這個是用來獲取Json數據。一個是Gson這個是用來解析Json數據。
本章的目標:
-
讀取暴雪的API數據
-
解析該數據
使用Volley來獲取Json數據
Volley支持原生字符串、圖像、Json。可以讓我們更專注於應用程序的邏輯。Volley通過下面的方法獲取。
$git clone https://android.googlesource.com/platform/framework/volley
在Android Studio 中引用Volley
File->Import Module 然后按着流程來就可以了,如果需要安裝什么Android Studio都會自動提示。(注意:需要VPN)
設置依賴關系
如上圖,File->Project Structure 或者 Ctrl+Alt+Shift+S
點擊app,然后點擊最右邊綠色+號選擇Module dependency,然后選擇Volley。現在開始就可以正常的使用Volley了。敲完代碼后一路Alt+Enter。代碼就能夠正常運行了。
在這個應用中我們現在要的到一個英雄角色的裝備數據,我們使用如下API
http://tw.battle.net/api/d3/profile/kakyban-3879/hero/26135206
這段Json的數據大概如下
我們在程序中的代碼為
String url = "json的地址";
RequestQueue queue = Volley.newRequestQueue(getActivity());
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//這里的response就是返回的Json數據
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//如果執行到這里,說明Volley沒有正常工作
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
Debug查看一下,數據沒有問題。
使用Gson來解析Json字符串
Gson我使用它主要的原因可能就是我的Android Studio里面貌似是集成的,我直接就引用了。當然設置依賴還是必須的,參考Volley的設置。
示例的Json代碼為:
http://tw.battle.net/api/d3/profile/kakyban-3879/hero/26135206
這是http://tw.battle.net上的真實數據,大家隨時都可以查看。
Json的結構是這個樣子的
首先我們要創建一個類Hero,它包含id、name、class等字段,注意class是保留字,所以我更名為class1,並且加入了@SerializedName("class")意思是將Json里面的class字段映射為class1。還有包含"-"特殊符號的last-updated我映射為了lastupdated。一個總類我定義為Hero,Hero里面包含了skills,items,followers,stats,kills,progression類,我們首先只實現Hero和items。
public class Hero{
@SerializedName("class")
private String class1;
private boolean dead;
private Followers followers;
private Number gender;
private boolean hardcore;
private Number id;
private Items items;
private Kills kills;
@SerializedName("last-updated")
private Number lastupdated;
private Number level;
private String name;
private Number paragonLevel;
private Number seasonCreated;
private boolean seasonal;
private Skills skills;
private Stats stats;
public String getClass1(){
return this.class1;
}
public void setClass1(String class1){
this.class1 = class1;
}
public boolean getDead(){
return this.dead;
}
public void setDead(boolean dead){
this.dead = dead;
}
public Followers getFollowers(){
return this.followers;
}
public void setFollowers(Followers followers){
this.followers = followers;
}
public Number getGender(){
return this.gender;
}
public void setGender(Number gender){
this.gender = gender;
}
public boolean getHardcore(){
return this.hardcore;
}
public void setHardcore(boolean hardcore){
this.hardcore = hardcore;
}
public Number getId(){
return this.id;
}
public void setId(Number id){
this.id = id;
}
public Items getItems(){
return this.items;
}
public void setItems(Items items){
this.items = items;
}
public Kills getKills(){
return this.kills;
}
public void setKills(Kills kills){
this.kills = kills;
}
public Number getLastupdated(){
return this.lastupdated;
}
public void setLastupdated(Number lastupdated){
this.lastupdated = lastupdated;
}
public Number getLevel(){
return this.level;
}
public void setLevel(Number level){
this.level = level;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public Number getParagonLevel(){
return this.paragonLevel;
}
public void setParagonLevel(Number paragonLevel){
this.paragonLevel = paragonLevel;
}
public Number getSeasonCreated(){
return this.seasonCreated;
}
public void setSeasonCreated(Number seasonCreated){
this.seasonCreated = seasonCreated;
}
public boolean getSeasonal(){
return this.seasonal;
}
public void setSeasonal(boolean seasonal){
this.seasonal = seasonal;
}
public Skills getSkills(){
return this.skills;
}
public void setSkills(Skills skills){
this.skills = skills;
}
public Stats getStats(){
return this.stats;
}
public void setStats(Stats stats){
this.stats = stats;
}
}
Items很長
大概為上圖這個樣子。解析數據的代碼如下:
Gson gson = new Gson();
Hero mHero = gson.fromJson(json, Hero.class);
Json為json字符串。如果你只實現了Hero,Items2個類,那么Gson會自動根據對應的字段映射數據。在調試器中查看如下圖所示,數據很成功。
注意:Items是一個很大的bean 在bean里面的類必須是static的。
小結:
本文純粹只是講述了如何從暴雪的Api中讀取數據,並且解析成類。所有的方法都不是最好的。比如Gson,當我做完了才發現fastJson貌似更快。fastJson是阿里的工程師設計的一個庫,不依賴其他的第三方庫,速度是Gson的6倍。
所有的一切都只是為了實現類似下面的效果:
本篇文章所對應的API鏈接得到的結果也是這章圖中的數據。