使用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链接得到的结果也是这章图中的数据。