• Diablo3英雄榜-使用Volley和Gson来处理暴雪API的Json数据


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

  • 相关阅读:
    ASP.NET MVC5(二):控制器、视图与模型
    LINUX重启MYSQL的命令
    mysql unrecognized service问题解决
    UML类图几种关系的总结
    java用org.apache.poi包操作excel
    struts2.xml 中result type属性说明
    MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
    报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost
    linux下使用yum安装mysql
    关于LINUX权限-bash: ./startup.sh: Permission denied
  • 原文地址:https://www.cnblogs.com/canglin/p/4404423.html
Copyright © 2020-2023  润新知