一起来开发Android的天气软件(四)——使用Gson解析数据
离上一篇文章过去才4、5天,我们赶紧趁热打铁继续完毕该系列的天气软件的开发。
承接上一章的内容使用Volley实现网络的通信。返回给我们的是这一串Json数据{"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多云转晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}},不知有没有同学跟着我的步骤已经得到了以上的Json数据呢,接下来我们须要在我们的Android对以上数据解析!Lets go!
一、什么是Json?
Json是一种相似于XML的通用数据交换格式,具有比XML更高的传输效率,体积较小,在网络传输时也能够更节省流量。但缺点也有,相比于XML语义性更差。看起来远不如XML直观。
从结构上看,全部的数据(data)终于都能够分解成三种类型,但如今基本上经常使用的就是映射(mapping)这样的类型,一个名/值对(Name/value),即数据有一个名称,另一个与之相相应的值,这又称作散列(hash)或字典(dictionary),比方"首都:北京"。它的规格呢也是非常easy固定的。
(1) 并列的数据之间用逗号(",")分隔,如"city":"杭州","cityid":"101210101",city与cityid两个数据之间是用,隔开的
(2) 映射用冒号(":")表示。如"city":"杭州"
(3) 并列数据的集合(数组)用方括号("[]")表示。比方假设返回的数据是有好几天的,那么天气的数据就会有好几组,会返回相似以下的数据形式"weatherinfo":[{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多云转晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"},{"city":"杭 州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多云转晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}]
(4) 映射的集合(对象)用大括号("{}")表示。比如中国天气网给我们返回的首先是一整个是Weather对象。然后里头包括一个Weatherinfo对象。
二、怎样解析Json数据?
我们先使用最简单的方法解析中国天气网返回的数据。
/**
* 解析server返回的JSON数据,并将解析出的数据存储到本地。
*/
public static void handleWeatherResponse(Context context, String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONObject weatherInfo = jsonObject.getJSONObject("weatherinfo");
String cityName = weatherInfo.getString("city");
String weatherCode = weatherInfo.getString("cityid");
String temp1 = weatherInfo.getString("temp1");
String temp2 = weatherInfo.getString("temp2");
String weatherDesp = weatherInfo.getString("weather");
String publishTime = weatherInfo.getString("ptime");
saveWeatherInfo(context, cityName, weatherCode, temp1, temp2,
weatherDesp, publishTime);
} catch (JSONException e) {
e.printStackTrace();
}
}
将server返回的response通过创建一个JSONObject对象 jsonobject,再通过weatherinfo这个key值去获取它所相应weatherinfo所包括的属性,之后就通过getString()通过键值对映射的方法一个个获取当中的对象值啦!
是不是觉得写起来好麻烦啊。有反复啊。无脑操作的代码要反复写好几遍了。
三、使用Gson解析数据?
假设你觉得JSONObject解析JSON数据的方法已经足够简单,那你真的太容易满足了,Gson开源库能够让解析数据简单到难以置信的!
只是万事的开头你还得先去下载一下GSONde jar包,导入自己的程序文件中。
然后呢我们再看一下我们要解析的Json数据格式{"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多云转晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}},依据其格式我们先定义一个weather类。
package com.melhc.model;
public class Weather {
	private Weatherinfo weatherinfo;
	public Weatherinfo getWeatherinfo() {
		return weatherinfo;
	}
	public void setWeatherInfo(Weatherinfo weatherinfo) {
		this.weatherinfo = weatherinfo;
	}
}
然后这个weather类里有一个weatherinfo对象,这个对象呢又包括着city,cityid,temp1等等的对象,该怎么办呢。
package com.melhc.model;
public class Weatherinfo {
   private String city;
   private String cityid;
   private String temp1;
   private String temp2;
   private String weather;
	private String ptime;
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getCityid() {
		return cityid;
	}
	public void setCityid(String cityid) {
		this.cityid = cityid;
	}
	public String getTemp1() {
		return temp1;
	}
	public void setTemp1(String temp1) {
		this.temp1 = temp1;
	}
	public String getTemp2() {
		return temp2;
	}
	public void setTemp2(String temp2) {
		this.temp2 = temp2;
	}
	public String getWeather() {
		return weather;
	}
	public void setWeather(String weather) {
		this.weather = weather;
	}
	public String getPtime() {
		return ptime;
	}
	public void setPtime(String ptime) {
		this.ptime = ptime;
	}
	@Override
	public String toString() {
		return "WeatherInfo [city=" + city + ", cityid=" + cityid + ", temp1="
				+ temp1 + ", temp2=" + temp2 + ", weather=" + weather
				+ ", ptime=" + ptime + "]";
	}
}
仅仅要在定义一个weatherinfo类就好了,加入city等等字段到该类里头。而且注意属性的数据类型要一一相应的否则会解析失败的,万事具备。剩下来的就交给Gson吧
	public static void handleWeatherResponse(Context context, String response) {
		try {
			Gson gson = new Gson();
			Weather weather = gson.fromJson(response, Weather.class);
			Weatherinfo info = weather.getWeatherinfo();
			saveWeatherInfo(context, info);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
看到没有仅仅须要三步就完毕了数据的解析。有没有非常easy呢!
我们仅仅须要通过gson,from()方法就能够把数据内容映射到指定类中!SO,easy! 大家可能注意到在这三步骤结束之后另一个saveWeatherinfo方法。这种方法用来干嘛的呢!
	public static void saveWeatherInfo(Context context, Weatherinfo info) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日", Locale.CHINA);
		SharedPreferences.Editor editor = PreferenceManager
				.getDefaultSharedPreferences(context).edit();
		editor.putBoolean("city_selected", true);
		editor.putString("city_name", info.getCity());
		editor.putString("weather_code", info.getCityid());
		editor.putString("temp1", info.getTemp1());
		editor.putString("temp2", info.getTemp2());
		editor.putString("weather_desp", info.getWeather());
		editor.putString("publish_time", info.getPtime());
		LogUtil.i("UTILITY", "----------------->" +  sdf.format(new Date()));
		editor.putString("current_date", sdf.format(new Date()));
		editor.commit();
	}
这种方法就是我们使用Sharedpreference共享參数存储一下我们当天得到的天气数据,这样用户每次打开就能够直接读取之前得到的数据,在有须要的时候再通过网络获取即时的天气数据就好了。editor.put方法还不能直接存储类。仅仅能存储主要的数据类型,我们这里就仅仅能一个个put啦。
好的。这一节课的内容就说到这里。也希望大家能继续支持该系列的博文。你们的支持是我写下去的最大动力!今天的GSON解析数据的内容就到此结束,下一篇博文也会非常快跟大家见面的。
一起来开发Android的天气软件(四)——使用Gson解析数据的更多相关文章
- 一起来开发Android的天气软件(三)——使用Volley实现网络通信
		
距离上一篇一起来开发Android天气软件二的时间又将近半个月了,之间一直由于有事而没有更新实在抱歉,近期会加快更新的步伐.争取在2015年到来前写完这系列的博文,上一章我们已经使用LitePal框架 ...
 - Android Animation学习(四) ApiDemos解析:多属性动画
		
Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...
 - 从零開始开发Android版2048 (四) 分数、重置、结束
		
这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存 首先,2048这个游戏的分数包含 ...
 - Android Context MODE的四种模式解析(转)
		
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...
 - 【Xamarin开发 Android 系列 8】 创建一个Json读取数据应用(上)
		
后续将内容贴上来...........
 - [安卓开发板]迅为IMX6 四核Android开发板
		
工业级核心板-Android开发板 10层高速PCB设计,充分保证电磁兼容 处理器:开发板默认是四核商业扩展级芯片,可根据用户需求更换单核.双核.工业级.汽车级处理器,批量更省成本. 扩展引脚:320 ...
 - Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)
		
Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...
 - 介绍开发Android手持终端PDA盘点APP软件
		
介绍开发Android手持终端PDA盘点APP软件 软件需要自动识别我导入的TXT格式或者excl格式的盘点表,然后自动生成一个复盘数据,做AB比对,界面上需要显示的有总数量,单品数量,条码,编码,商 ...
 - 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)
		
参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...
 
随机推荐
- php 实时汇率接口
			
function getExchangeRate($from_Currency,$to_Currency) { $amount = urlencode($amount); $from_Currenc ...
 - AssertValid函数学�
			
转自http://tsitao.blog.163.com/blog/static/29795822006914105840496/ VC的调试中,AssertValid和Dump函数的应用 CObje ...
 - android  JSON数据格式 解析
			
一. JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. Json建构于两种结构: 最后再加一种格式在文章的最后显示出来非常少有的格式 ...
 - 远光软件ASP.NET笔试题小汇总
			
ASP.NET笔试题是ASP.NET程序员面试必须经历的,一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据 ...
 - TPanel的默认颜色存储在dfm中,读取后在Paint函数中设置刷子的颜色,然后填充整个背景
			
声明如下: TCustomPanel = class(TCustomControl) private FFullRepaint: Boolean; FParentBackgroundSet: Bool ...
 - unity3d ngui-TweenRotation-TweenPosition-TweenScale
			
using UnityEngine; using System.Collections; public class TweenFlipCARDS : MonoBehaviour { private f ...
 - 可以根据柜子内表取出所有的柜子信息的BAPI函数
			
DATA: gt_hunumbers TYPE STANDARD TABLE OF bapihunumber, gt_huitem TYPE STANDARD TABLE OF bapih ...
 - jqueryUI中datepicker的使用,解决与asp.net中的UpdatePanel联合使用时的失效问题
			
1.jqueryUI的datepicker的使用 -->首先在jqueryUI官网上根据你的需要下载适合你系统主题的样式,jqueryUI主题下载地址: -->下载后的文件 jquery- ...
 - C#对HTTP数据还原
			
使用C#对HTTP数据还原 [创建时间:2016-05-12 00:19:00] NetAnalyzer下载地址 在NetAnalyzer2016中加入了一个HTTP分析功能,很过用户对此都很感兴 ...
 - 14.3.2.4 Locking Reads  锁定读
			
14.3.2.4 Locking Reads 锁定读 如果你的查询数据,然后插入或者更新相关的数据 在同一个事务, 普通的SELECT 语句不足以给予足够保护. 其他事务可以更新或者删除相同的你要查询 ...