Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...

Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示


今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家还是很有帮助的,老司机要开车了

涉及到网络,你就一定要先添加权限,准没错

<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET" />

一.归属地查询(JSONObject)

这个也是最简单的一类Json了,我的博客

  • Google官方网络框架-Volley的使用解析Json以及加载网络图片方法
  • Google官方网络框架Volley实战——QQ吉凶测试,南无阿弥陀佛!

里面不管是手机归属地查询还是QQ吉凶,解析得到的Json都是最简单的类型,我们这里以手机归属地为例来讲述

这里的接口

http://apis.juhe.cn/mobile/get?phone=18679606764&key=22a6ba14995ce26dd0002216be51dabb

这里说明一下,我们现在以及接下来的例子,都会用到Volley来解析接口得到Json,所以不会用Volley的话可以先去看一下上面的两篇文章

  • https://github.com/adamrocker/volley

Volley你到哪都能下载到,就不详细说了

既然我们接口有了,我们就开始解析吧

/*** 解析接口*/private void Volley_Get() {String url = "http://apis.juhe.cn/mobile/get?phone=" + myPhone+ "&key=22a6ba14995ce26dd0002216be51dabb";RequestQueue queue = Volley.newRequestQueue(this);StringRequest request = new StringRequest(Method.PUBLIC, url,new Response.Listener<String>() {// 成功@Overridepublic void onResponse(String json) {Log.i("Json", json);}}, new Response.ErrorListener() {// 失败@Overridepublic void onErrorResponse(VolleyError errorLog) {Log.e("Error", errorLog.toString());}});queue.add(request);}

这样,我们就解析得到了一串JSON,也就是今天本文中的主角

{"error_code": 0,"reason": "Return Successd!","result": {"areacode": "0796","card": "江西联通GSM卡","city": "吉安","company": "中国联通","province": "江西","zip": "343000"},"resultcode": "200"
}

我们可以看到,JSON是由一个大括号括起来的,里面是键值对,每一个键对应一个值,当然,他里面还有一个result的大括号包裹着一堆数据,这里我推荐一个工具叫

  • HiJson(网上有下,自行搜索一下就可以了)

我们来看他的构造

这里写图片描述

这里看起来就十分的清晰了,我们一层层的剥下来,这里要用到的就是我们org.json下的JSONObject类

    /*** 解析Json** @param json*/private void Volley_Json(String json) {try {JSONObject jsonObject = new JSONObject(json);JSONObject object = jsonObject.getJSONObject("result");tv_content.setText("归属地:" + object.getString("province") + "-"+ object.getString("city") + "\n" + "区号:" + object.getString("areacode")+ "\n" + "运营商:" + object.getString("company")+ "\n" + "用户类型:" + object.getString("card"));} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

这里,我们可以看到,我们new一个JSONObject 并且把json穿进去解析,然后getJSONObject获取一个json里面的字段,再去用getString(name)去获取键得到值,所以运行结果

这里写图片描述

是不是没什么难度?那我们来稍微做一个难一点的,笑话大全

二.笑话大全(JSONArray)

我们同样的,需要一个接口

http://japi.juhe.cn/joke/content/list.from?key=56e5f85c150ebd54461ae4fb7c6705ec&page=1&pagesize=1&sort=asc&time=1418745237

然后我们继续用Volley来解析这个接口得到Json

 /*** 解析接口*/private void Volley_Get() {String url = "http://japi.juhe.cn/joke/content/list.from?key=56e5f85c150ebd54461ae4fb7c6705ec&page=1&pagesize=1&sort=asc&time=1418745237";RequestQueue queue = Volley.newRequestQueue(this);StringRequest request = new StringRequest(Method.PUBLIC, url,new Response.Listener<String>() {// 成功@Overridepublic void onResponse(String json) {Log.i("Json", json);}}, new Response.ErrorListener() {// 失败@Overridepublic void onErrorResponse(VolleyError errorLog) {Log.e("Error", errorLog.toString());}});queue.add(request);}

这样,我们得到的JSON就是

{"error_code": 0,"reason": "Success","result": {"data": [{"content": "大脑:别睡了快起来吧要迟到了。 身体:滚,别烦我我还要再躺会。 时间:你俩慢慢吵我先溜了。 尿:再不起我就出来了!","hashId": "0ee18f8733dc6744e6db6d0312839e5b","unixtime": 1462885431,"updatetime": "2016-05-10 21:03:51"}]}
}

我们需要的是中间的文字,但是这个json和之前那个json就有点不一样了,这个明显里面有一个数组,所以我们要用JSONArray数组来解析了,我们先来看一下结构

这里写图片描述

这个结构明显要复杂一些,就在Data里面他里面还有一个数组,所以我们解析起来就要先遍历一下了

 /*** 解析Json** @param json*/private void Volley_Json(String json) {try {JSONObject jsonObject = new JSONObject(json);JSONObject jsonObject2 = jsonObject.getJSONObject("result");JSONArray ja = jsonObject2.getJSONArray("data");for (int i = 0; i < ja.length(); i++) {JSONObject jsonObject3 = (JSONObject) ja.get(i);tv_content.setText(jsonObject3.getString("content"));}} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

我们可以看到,我们是一层一层的去解析的,首先是解析得到最外面的result,返回的是一个JSONObject ,然后继续解析data,返回的是一个JSONArray,然后我们遍历一下 JSONObject jsonObject3 = (JSONObject) ja.get(i);强转成一个JSONObject ,解析到最后我们就可以直接getString(“content”)拿到数据了,是不是思路很清晰?我们看一下效果图

这里写图片描述

三.天气预报(JSONArray * 2)

这个也是比较复杂的,也是我项目中有用到的,就是一个JSON里面有数组,数组里面也有数组,这样嵌套,其实说难也不难,只要掌握了思路,剩下的,只不过就是工作量的问题了

这里我们用到的接口是和风天气的接口

  • 官网:http://www.heweather.com/

接口

https://api.heweather.com/x3/weather?city=%E6%B7%B1%E5%9C%B3&key=你的key

我们先用Volley解析接口

 /*** 获取天气** @param city 城市名*/private void getWeather(String city) {String url = "https://api.heweather.com/x3/weather?city=" + city+ "&key=你的key";RequestQueue queue = Volley.newRequestQueue(this);StringRequest request = new StringRequest(Request.Method.GET, url,new Response.Listener<String>() {// 成功@Overridepublic void onResponse(String json) {Log.i("json", json);}}, new Response.ErrorListener() {// 失败@Overridepublic void onErrorResponse(VolleyError errorLog) {Log.e("Error", errorLog.toString());}});queue.add(request);}

这里,我们解析到了Json,有点长哦

{"HeWeather data service 3.0": [{"aqi": {"city": {"aqi": "60","co": "1","no2": "53","o3": "46","pm10": "65","pm25": "42","qlty": "良","so2": "7"}},"basic": {"city": "深圳","cnty": "中国","id": "CN101280601","lat": "22.544000","lon": "114.109000","update": {"loc": "2016-05-10 22:07","utc": "2016-05-10 14:07"}},"daily_forecast": [{"astro": {"sr": "05:45","ss": "18:54"},"cond": {"code_d": "301","code_n": "101","txt_d": "强阵雨","txt_n": "多云"},"date": "2016-05-10","hum": "70","pcpn": "25.4","pop": "98","pres": "1008","tmp": {"max": "32","min": "23"},"vis": "7","wind": {"deg": "216","dir": "无持续风向","sc": "微风","spd": "4"}},{"astro": {"sr": "05:44","ss": "18:54"},"cond": {"code_d": "101","code_n": "300","txt_d": "多云","txt_n": "阵雨"},"date": "2016-05-11","hum": "64","pcpn": "0.0","pop": "13","pres": "1008","tmp": {"max": "29","min": "23"},"vis": "10","wind": {"deg": "118","dir": "无持续风向","sc": "微风","spd": "10"}},{"astro": {"sr": "05:44","ss": "18:55"},"cond": {"code_d": "300","code_n": "101","txt_d": "阵雨","txt_n": "多云"},"date": "2016-05-12","hum": "68","pcpn": "0.1","pop": "7","pres": "1009","tmp": {"max": "29","min": "25"},"vis": "10","wind": {"deg": "129","dir": "无持续风向","sc": "微风","spd": "7"}},{"astro": {"sr": "05:44","ss": "18:55"},"cond": {"code_d": "101","code_n": "302","txt_d": "多云","txt_n": "雷阵雨"},"date": "2016-05-13","hum": "69","pcpn": "9.8","pop": "53","pres": "1011","tmp": {"max": "29","min": "23"},"vis": "7","wind": {"deg": "123","dir": "无持续风向","sc": "微风","spd": "1"}},{"astro": {"sr": "05:43","ss": "18:56"},"cond": {"code_d": "302","code_n": "302","txt_d": "雷阵雨","txt_n": "雷阵雨"},"date": "2016-05-14","hum": "73","pcpn": "5.3","pop": "66","pres": "1011","tmp": {"max": "29","min": "23"},"vis": "10","wind": {"deg": "115","dir": "无持续风向","sc": "微风","spd": "10"}},{"astro": {"sr": "05:43","ss": "18:56"},"cond": {"code_d": "302","code_n": "302","txt_d": "雷阵雨","txt_n": "雷阵雨"},"date": "2016-05-15","hum": "69","pcpn": "7.7","pop": "58","pres": "1009","tmp": {"max": "29","min": "22"},"vis": "10","wind": {"deg": "166","dir": "无持续风向","sc": "微风","spd": "4"}},{"astro": {"sr": "05:42","ss": "18:57"},"cond": {"code_d": "302","code_n": "101","txt_d": "雷阵雨","txt_n": "多云"},"date": "2016-05-16","hum": "67","pcpn": "1.8","pop": "50","pres": "1008","tmp": {"max": "28","min": "23"},"vis": "10","wind": {"deg": "10","dir": "无持续风向","sc": "微风","spd": "8"}}],"hourly_forecast": [{"date": "2016-05-10 22:00","hum": "89","pop": "38","pres": "1009","tmp": "27","wind": {"deg": "80","dir": "东风","sc": "微风","spd": "4"}}],"now": {"cond": {"code": "101","txt": "多云"},"fl": "28","hum": "88","pcpn": "0","pres": "1008","tmp": "25","vis": "10","wind": {"deg": "10","dir": "南风","sc": "3-4","spd": "14"}},"status": "ok","suggestion": {"comf": {"brf": "较不舒适","txt": "白天天气多云,同时会感到有些热,不很舒适。"},"cw": {"brf": "不宜","txt": "不宜洗车,路面积水较多,不宜擦洗汽车。如果执意擦洗,要做好溅上泥水的心理准备。"},"drsg": {"brf": "热","txt": "天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。"},"flu": {"brf": "少发","txt": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。"},"sport": {"brf": "较适宜","txt": "天气较好,户外运动请注意防晒,推荐您在室内进行低强度运动。"},"trav": {"brf": "适宜","txt": "天气较好,但丝毫不会影响您出行的心情。温度适宜又有微风相伴,适宜旅游。"},"uv": {"brf": "弱","txt": "紫外线强度较弱,建议出门前涂擦SPF在12-15之间、PA+的防晒护肤品。"}}}]
}

这里,我们可以根据结构图来分析

这里写图片描述

这里我们可以看到,他本身就是一个数组,接着又是一个数组,数组里面包含着接下来七天的天气情况,这里呢,我们就不做的特别详细了,我们写三天 ,怎么写呢?看着哈

/*** 解析Json** @param json*/private void Volley_Json(String json) {try {JSONObject jsonObject = new JSONObject(json);JSONArray jArray = jsonObject.getJSONArray("HeWeather data service 3.0");for (int i = 0; i < jArray.length(); i++) {JSONObject jb1 = (JSONObject) jArray.get(i);JSONArray jr1 = jb1.getJSONArray("daily_forecast");for (int j = 0; j < jr1.length(); j++) {JSONObject jb2 = (JSONObject) jr1.get(j);JSONObject jb3 = jb2.getJSONObject("tmp");dateList.add(jb2.getString("date"));weatherList.add(jb2.getJSONObject("cond").getString("txt_n"));TmpList.add(jb3.getString("min") + "-"+ jb3.getString("max"));}}// 设置参数today_date.setText(dateList.get(0));today_weather.setText(weatherList.get(0));today_tmp.setText(TmpList.get(0));tomorrow_date.setText(dateList.get(1));tomorrow_weather.setText(weatherList.get(1));tomorrow_tmp.setText(TmpList.get(1));after_date.setText(dateList.get(2));after_weather.setText(weatherList.get(2));after_tmp.setText(TmpList.get(2));//设置图片if (weatherList.get(0).equals("晴")) {today_img.setImageResource(R.mipmap.sun);} else if (weatherList.get(0).equals("多云")) {today_img.setImageResource(R.mipmap.cloudy);} else {today_img.setImageResource(R.mipmap.rain);}if (weatherList.get(1).equals("晴")) {tomorrow_img.setImageResource(R.mipmap.sun);} else if (weatherList.get(1).equals("多云")) {tomorrow_img.setImageResource(R.mipmap.cloudy);} else {tomorrow_img.setImageResource(R.mipmap.rain);}if (weatherList.get(2).equals("晴")) {arter_img.setImageResource(R.mipmap.sun);} else if (weatherList.get(2).equals("多云")) {arter_img.setImageResource(R.mipmap.cloudy);} else {arter_img.setImageResource(R.mipmap.rain);}} catch (JSONException e) {e.printStackTrace();}//清空数据dateList.clear();weatherList.clear();TmpList.clear();}

这里代码虽然多,但是后半部分基本上可以不看,就是设置数据和图片的,我们这里同样的getJSONArray获取到整个数组,然后开始遍历这个数组,强转为JSONObject 之后我们再次的获取每天的小数组daily_forecast,到这里,就和上面一样了,我们又强转为JSONObject 就可以开始getString(name)了,但是我们这里要获取三天的数据,所以我用一个List装起来,然后拿出来设置到TextView上,然后再根据天气设置图片,最后,清空一下List,因为他每次请求我们都是只获取他的前三天数据,所以运行的结果就是这样:

这里写图片描述

是不是这篇博客挺实用的,如果觉得好的话,可以点个赞哟,谢谢大家了

Demo下载:http://download.csdn.net/detail/qq_26787115/9516126

我的群,通往Android的神奇之旅 :555974449,欢迎大家进来交流技术!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①

使用名称TransformerNameTransformer是在Caliburn.Micro v1.1中引入的&#xff0c;它是ViewLocator和ViewModelLocator如何将类名映射到其伙伴角色的一个组成部分。虽然您可以覆盖这些服务上的各种函数来替换底层行为&#xff0c;但您的大多数需求都应该通过使用适当的NameTran…

史上最可怜的科学家:出生先天不足,家道中落吃不上饭,追个星丢工作,拜师被冤枉,写书又被烧,最后还被拖工资活活拖死了......

全世界只有3.14 % 的人关注了爆炸吧知识今天&#xff0c;小天来向各位模友介绍一个痴迷偶像正面刚的小迷弟吧。多病的贫家子&#xff0c;鲁莽的小迷弟1571年&#xff0c;开普勒在德国维尔镇呱呱落地了。作为一个善解人意的宝宝&#xff08;胚胎&#xff09;&#xff0c;开普勒没…

C# WPF MVVM开发框架Caliburn.Micro View / View Model 命名⑨

01—约定在收到Caliburn Micro中有关视图和ViewModel解析的反馈后&#xff0c;我们添加了新功能&#xff0c;以简化类型解析&#xff0c;同时保持驱动它的健壮的基于正则表达式的名称转换机制。为了更好地了解这些新功能以及类型解析通常如何在框架中工作&#xff0c;现在是详细…

史上最气人的数学家:文理双全智商还高,说话只说半句,解题只解半个,调戏人调戏了三百年还不够......

全世界只有3.14 % 的人关注了爆炸吧知识大家上学的时候有没有想过&#xff1a;在数学试卷上调戏阅卷人。想想小天&#xff0c;会都不会写&#xff0c;还调戏阅卷人&#xff1f;想都不敢想。但一个知乎大佬就做了。他居然用费马的原话作答&#xff1a;我已经想到了一个极佳的证明…

掌握这个姿势,女友不再叨叨叨

1 请收下我的膝盖2 正确姿势3 前世五百次的回眸 才换来今生的一次神同步4 论引体向上&#xff0c;你是不如我的5 教科书式的傲娇6 只有我最摇摆7 这是什么原理&#xff1f;你点的每个赞&#xff0c;我都认真当成了喜欢

ubuntu安装matlab2009,Ubuntu中安装Matlab2010a

Ubuntu中安装Matlab2010a一&#xff0e;前言&#xff1a;相信大家对于Matlab应该很熟悉吧&#xff0c;我就不多做介绍了。对于如何在Ubuntu中安装Matlab很多人都不懂&#xff0c;大家都是新手&#xff0c;可以理解。我自己本身就是一个菜鸟&#xff0c;所以决定写这篇文章&…

45岁,一个平凡大叔的异地打工生活

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#xff0c;首发于 【掘金】&#x1f4e2;作者格言&#xff1a;生活在于…

用高等数学“铲雪”!这个200多年前的证明太厉害了,有城市用它省了2000多万..........

全世界只有3.14 % 的人关注了爆炸吧知识用高等数学清扫脚下路前几天&#xff0c;北京下了2021年的第一场雪。这让生活在广州的超模君羡慕不已&#xff0c;原本打算春节前去哈尔滨看个冰雕&#xff0c;结果由于各种原因一直都没成行。一个月前被关进小黑屋的设计师妹子刚好来自哈…

matlab排版形式是什么样子,工作型PPT,图文排版的4种常见样式

原标题&#xff1a;工作型PPT&#xff0c;图文排版的4种常见样式图片是PPT中最好用的一种元素&#xff0c;正所谓“一图抵过千言”。但要想让图片真正地发挥价值&#xff0c;图文排版的好坏非常关键。本期将聊聊4种图文排版的处理方法。这些方法也是我们日常工作中的PPT图文排版…

基于事件驱动架构构建微服务第15部分:SPA前端

原文链接 https://logcorner.com/building-micro-services-through-event-driven-architecture-part15-spa-front-end/在本教程中&#xff0c;我将展示如何使用angular构建SPA前端来发送命令和请求查询。SPA前端使用commandAPI发送命令&#xff08;创建、更新或删除语音&#x…

BBC又一神作,豆瓣9.8分,美轮美奂的大自然不仅仅属于人类

总有那么一些人&#xff0c;满怀着对世界的好奇&#xff0c;不远万里不畏艰难去穿越世界上每一个角落&#xff0c;为我们呈现出仅凭我们自己绝无可能看到的世间真实与美好。今天给大家推荐一部BBC出品的一部纪录片&#xff0c;纪录片爱好者肯定听过&#xff1a;BBC出品&#xf…

想追身边的女孩?哥们我只能帮到你这份上了

1 接下来&#xff0c;就靠你自己了……2 不是女神就别想了3 你再来&#xff0c;我可撕票喽4 总有刁民想害朕。。5 每次我想偷偷溜出去玩&#xff0c;我妈就6 看看谁在偷懒你点的每个赞&#xff0c;我都认真当成了喜欢

C#内建接口:IEnumerable

这节讲一下接口IEnumerable。01什么是Enumerable在一些返回集合数据的接口中&#xff0c;我们经常能看到IEnumerable接口的身影。那什么是Enumerable呢&#xff1f;首先它跟C#中的enum关键字所表达的意思是不同的&#xff0c; 从翻译上来看&#xff1a;可枚举的&#xff0c;展开…

ubuntu,kali linux和windows三系统流水账——写给自己

我先说一下ubuntu和windows双系统安装的几种方法&#xff0c;最后总结kali linux的安装&#xff0c;想起什么写什么&#xff0c;所以有点乱。然后记录一下自己的使用过程中遇见的问题和解决的方法&#xff0c;还有我的个人建议。 我个人安装的是目前最新的ubuntu16.04LTS。wind…

一个富二代仅凭“1+1”就压制了全世界的数学家两个世纪......

全世界只有3.14 % 的人关注了爆炸吧知识在数学界&#xff0c;“11”是一个超级大难题&#xff0c;吸引了许多优秀的数学家去攻关打boss。但至今还未有人闯关成功。这位被众多数学家恨得牙痒痒的罪魁祸首就是——克里斯蒂安哥德巴赫。克里斯蒂安哥德巴赫1690年3月18日&#xff0…

Android框架之网络开发框架Volley

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术&#xff0c;而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android 系统中主要提供了两种方式来进行HTTP通信&#xff0c;HttpURLConnection和HttpClient&#xff0c;几乎在任何项目…

史上最会抄的数学家!把阿拉伯数字直接抄进自己的书里,连中国几千年前的名著都惨遭毒手.........

全世界只有3.14 % 的人关注了爆炸吧知识大家都喜欢《蒙娜丽莎的微笑》&#xff0c;但你知道她为什么好看吗&#xff1f;《蒙娜丽莎的微笑》没错&#xff0c;她符合黄金分割法0.618原则嘛&#xff01;但你知道这世界上还有一个数列版的黄金分割法的吗&#xff1f;这个数列就是斐…

求数组里面的最大值和最小值

题目&#xff1a; 求数组里面的最大值和最小值比如&#xff1a;数组 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5最大值是5&#xff0c;最小值是1代码实现&#xff1a; #include <stdio.h> int max,min; void getMaxAndMin(int a[],int n){int *q;qa;maxmin*…

【ASP.NET开发】.NET三层架构简单解析

这篇文章本来应该很早就写出来的&#xff0c;但是一直苦于自己的精神能力有限&#xff0c;而且已经到了我们学校的考试周&#xff0c;所以时间上还是有点紧迫。关键的一点就是&#xff0c;找不到合理的思路来写&#xff0c;思路没有的话&#xff0c;就算是再好的素材&#xff0…