zoukankan      html  css  js  c++  java
  • 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链接得到的结果也是这章图中的数据。

  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/canglin/p/4404423.html
Copyright © 2011-2022 走看看