前面一篇关于Volley的文章中,我们学习了如何利用ImageRequest去网络中加载图片,那么今天我们就来学习一下如何利用volley去网络中加载Json格式数据,并将其展示在一个ListView上。

1)数据源:

private static final String WEATHER_LINK = "http://www.weather.com.cn/data/sk/101280101.html";

这是由中国天气网提供的关于某个城市的天气预告的Json数据,大家直接点击链接进去 http://www.weather.com.cn/data/sk/101280101.html可以看到如下的数据:

{"weatherinfo":{"city":"广州","cityid":"101280101","temp":"12","WD":"东风","WS":"2级","SD":"95%","WSE":"2","time":"21:05","isRadar":"1","Radar":"JC_RADAR_AZ9200_JB"}}

可以很清楚地看到这是一个Json格式的数据,其实JsonObject就是一个Map对象,所以这条链接提供的数据其实就是一个Weatherinfo的Map对象,它的属性值是Weatherinfo,然后其值是另外一个JsonObject对象,假设叫O,则这个O对象有很多属性,比如city,cityid,temp等,后面跟着的则是其对应的值。

那么我们如何在Android中利用Volley去获取这个数据呢?

2)Volley的应用

在这里,我们就用一个ListView简单地来展示其数据就好,先定义一个ListView,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ListViewandroid:id="@+id/lvWeather"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView></LinearLayout>

然后,我们要为这个ListView设定数据源,当然,我们先要去获取数据,那么接下来就是Volley的操作了。

跟前面ImageRequest的一样,我们首先也是要定义一个RequestQueue,如下:

private RequestQueue mQueue;
mQueue = Volley.newRequestQueue(this);

接下来,由于上面我们分析过,这个链接返回来的数据只是一个Object,并不是一个数组,所以在这里,我们需要使用的是JsonObjectRequest,而如果其它的链接返回来的是数组的结构,比如下面这样:

{"list":[{"id":"2775","cover":"http:\/\/app.itabcd.com\/\/public\/uploads\/news\/531d37fc5f460.jpg","title":"599 \u5143\uff0cNokia X \u4eac\u4e1c\u9884\u7ea6\u5f00\u542f",

在上面这种情况中,我们可以看到list是一个数组(其后面带有"[ ]"),那么我们就要使用JsonArrayRequest了。

接着看代码:

public void getWeatherInfo(){JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(WEATHER_LINK, null, new Response.Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject arg0) {list.clear();Iterator<String> it = arg0.keys();while(it.hasNext()){String key = it.next();JSONObject obj = null;try {obj = arg0.getJSONObject(key);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (obj != null) {Iterator<String> objIt = obj.keys();while (objIt.hasNext()) {String objKey = objIt.next();String objValue;try {objValue = obj.getString(objKey);HashMap<String, String> map = new HashMap<String, String>();map.put("title", objKey);map.put("content", objValue);Log.v(TAG, "title = " + objKey + " | content = " + objValue);list.add(map);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}Log.v(TAG, "list.size = " + list.size());}            }, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError arg0) {}});mQueue.add(jsonObjectRequest);

在上面的代码中,我们利用的是JsonObjectRequest中的构造函数:

    /*** Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is* <code>null</code>, <code>POST</code> otherwise.** @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)*/public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,ErrorListener errorListener) {this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,listener, errorListener);}

当我们将jsonRequest设置为null的时候,Volley会默认使用Get方式来发送我们的请求。

同样的,跟ImageRequest一样,我们需要实现两个回调函数,即两个Listener,一个是正常返回的数据,一个是错误返回的数据。

我们主要看的是Response.Listener里面的逻辑,在上面的代码中,可以看到,我们首先利用参数arg0的迭代器,获得第一个对象,此时,这个对象的key就是weatherinfo了,而其对应的值,其实还是一个JsonObject,所以,我们为了取得这个值里面的键值,我们需要再去遍历这个值中值,然后将其放到Map对象中,再将其放到list中。

其实逻辑很简单,是不?

然后我们利用SimpleAdapter来将数据展示出来,就好了,如下:

     setContentView(R.layout.activity_json);lvWeather = (ListView)findViewById(R.id.lvWeather);mQueue = Volley.newRequestQueue(this);getWeatherInfo();//{"weatherinfo":{"city":"广州","cityid":"101280101","temp":"12","WD":"东风","WS":"2级","SD":"95%",//"WSE":"2","time":"21:05","isRadar":"1","Radar":"JC_RADAR_AZ9200_JB"}}SimpleAdapter simpleAdapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2, new String[] {"title","content"}, new int[] {android.R.id.text1, android.R.id.text2});          lvWeather.setAdapter(simpleAdapter);

下面是效果图:

嗯,简单地应用就是这样了。源代码下载

关于如何利用Volley加载图片,大家可以参考:

Android中关于Volley的使用(一)加载图片

Android中关于Volley的使用(二)加载Json数据相关推荐

  1. Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据

    Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据 我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页 ...

  2. ajax传输json数据格式乱码_解决Ajax加载JSon数据中文乱码问题

    一.问题描述 使用zTree的异步刷新父级菜单时,服务器返回中文乱码,但项目中使用了SpringMvc,已经对中文乱码处理,为什么还会出现呢? 此处为的异步请求的配置: Java代码 async: { ...

  3. Cesium基础知识-加载json数据

    viewer = new Cesium.Viewer('cesiumContainer'); //加载json数据生成线 function CreateLineFromJson(params) { / ...

  4. Android中的缓存处理及异步加载图片类的封装

    一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端: 流量开销:对于客户端--服务器端应用,从远程获取图 ...

  5. android中常用的下拉刷新加载更多_如何设计“加载流程”

    为什么要处理"加载"状态 在页面拉取数据.或提交某些数据时,需要一定的时间来等待服务端返回结果.如果不处理加载,用户可能会看到一片空白,以为你的软件出错:或者因没有建立心理预期,被 ...

  6. ajax中html的属性,jQuery Ajax加载html数据正常,但属性似乎'不可读'

    请在我疯了之前帮助我. 好吧,所以我一直在为我的代码苦苦挣扎了一周,但我仍然不知道什么是不工作的.jQuery Ajax加载html数据正常,但属性似乎'不可读' 我可以使用锚标记的data-targ ...

  7. mapbox 加载json数据 和数据中颜色 和高度 并根据数值加载颜色

    代码 //添加geojson数据map.on('load', function () {map.addLayer({'id': 'room-extrusion','type': 'fill-extru ...

  8. UITableViewCell中嵌套UITableView,用UITextView加载HTML数据

    UIWebView可以加载HTML数据毋庸置疑,但是我们也都知道webView的性能不高,单个webView的话可能还好,但是如果我的tableviewcell中的内容是HTML数据,这时候再用web ...

  9. LayaBox -- 加载Json数据

    其实LayaBox加载Json还是蛮简单的,但是作为新手来说,其实也不容易,下面放出解决方法,在类比一下就知道有多容易了. 新建laya.json文件放入到bin目录下 // laya.json {& ...

最新文章

  1. angular集成websocket_Angular + Websocket
  2. rgb sw 线主板接口在哪_十代至尊i910980XE直接上:技嘉X299X AORUS MASTER主板评测
  3. 工业机器人码垛教学实施_工业码垛机器人存在问题与解决对策
  4. 华为3Com Quidway 2116-SI
  5. html 调用tcpdump,Linux tcpdump命令的用法详解(内容较多)
  6. python串口通信_python的串口通信(pyserial)
  7. cudnn版本_踩过cuda、cudnn的坑[持续更新]
  8. Hybrid App开发设计与实现
  9. docker export import后,导入镜像,启动时的错误,Error response from daemon: No command specified...
  10. Jquery自定义$的名称(自定义变量)
  11. linux运行raxml,在线和本地两种方法构建 RAxML 进化树方法和解读
  12. go mod机制详解
  13. 会员直推奖php程序_PHP自适应卡益源码 前台直销系统报单费直推奖
  14. 兰州理工大学计算机科学全国排名,兰州理工大学好吗,全国排名多少?
  15. 七战升鸿蒙需要什么条件,《鸿蒙圣墟》平民提升战力攻略
  16. JSX语法使用详解——终极版
  17. 【代码解析】mmaction2: SlowFast
  18. Apple Developer:苹果客服中心电话
  19. 第三十五篇(JavaScript基础)
  20. GitHub is free for teams -终于等到你

热门文章

  1. [EasyHexo 专栏] #1 - Markdown 编辑器推荐与语法简介
  2. uboot第一阶段详细分析
  3. 我是主考官:给一位应届毕业生的回信
  4. 3.1.1 zabbix(上)
  5. 全网最简单的k8s User JWT token管理器
  6. NodeJS 加密 —— crypto 模块
  7. [转]ORA-01555错误总结(二)
  8. Troubleshooting OpenStack 瘫痪 - 每天5分钟玩转 OpenStack(160)
  9. (c语言编程)出现错误:null undeclared identifier
  10. Linux 命令整理