您的位置:首页 > 其它

新手入门,和风天气预报免费API接口用GSON工具实现数据解析

2016-08-27 23:58 926 查看
作为一个入门不久的安卓小菜鸟,正在做一个个人项目。于是就想要做一个有关天气的APP,所以到网上找一些免费的接口来获得一些天气的数据,找来找去,最后选中了百度API里面的一个叫和风天气预报的接口,如下图,点击打开链接



没有预料到的是,我进了一个大大的坑中。和风天气返回的JSON字符串大概是这样的。

{
"HeWeather data service 3.0": [
{
"aqi": {
"city": {
"aqi": "43",
"co": "1",
"no2": "31",
"o3": "43",
"pm10": "39",
"pm25": "30",
"qlty": "优",
"so2": "9"
}
},
"basic": {
"city": "广州",
"cnty": "中国",
"id": "CN101280101",
"lat": "23.108000",
"lon": "113.265000",
"update": {
"loc": "2016-08-27 22:52",
"utc": "2016-08-27 14:52"
}
},
"daily_forecast": [
{
"astro": {
"sr": "06:07",
"ss": "18:49"
},
没错,这一个JSON字符串非常的复杂,里面有对象,有数组,对象里面又嵌入了对象,数组就更不用说了,里面又有对象,又有普通的字段。

由于我用的是GSON解析,因为这工具简单易用,要真的按照JSON工具类解析,那得累死啊。不过这个GSON工具最麻烦的就是要创建实体类啦,

这个实体类的里面的属性是有要求的,就是必须跟返回JSON字符串里的key(属性),一一对应。

比如说第一个属性aqi,aqi里面又有一个属性city,city里面才是我们要的值。那就必须得先创建一个类,类名随便取,里面只有一个属性,属性名必须得是city,而且这个city属于另一个类,这个类里面放的就是city的具体属性啦,像pm25,co等等的啦。然后给这个city属性加上get和set方法,全参与无参构造方法(此处我也不明白,反正是惯例了,大家有兴趣可以搜索一下)。

创建实体类就是体力活啦,要花很多的时间啦,当然这些都不是重点,最最最让人吐血的是,第一个字头,

<strong><span style="font-size:18px;color:#ff0000;"> "HeWeather data service 3.0"</span></strong>
这个属性是个什么鬼,中间带有两个空格,和一个点,这些都不能当做属性名啊,但是要用GSON解析的话,必须得生成属性名与JSON字符属性名一样的才行啊。这里真的卡住了我,然后我就去网上搜,发现解决方法原来这么简单,要多谢这位大神了,详情请点击大神的文章~~大神文章链接,在大神文章里面发现了一个不得了的东西,叫GSONFORMAT的工具,这是在Android
studio中的一个插件。这简单是神器啊,可以自动创建实体类,那我还花这么大力气创建一整天的实体类。还有就是网上也有许多在线解析JSON生成实体类的网站,实在没有必要这么累去一个个创建实体类,当初真是的too young too simple。

我发现自己的脑筋不会转变了,既然JSON字符串不符合规范那么处理一下不就行了吗,当时真的犯二了,JSON字符串本质上还是一个字符串,有这么多处理字符串的方法。

有时候真的是,稍微变通一下难题就会迎刃而解,当然解决了问题还是很让人愉快的,下面是我的代码。

String url="http://apis.baidu.com/heweather/weather/free";
ApiStoreSDK.execute(url, ApiStoreSDK.GET, para, new ApiCallBack(){
@Override
public void onSuccess(int status, String responseString) {
Log.d("hap.zhu", "success status="+status+",responseString="+responseString);
StringBuilder sb=new StringBuilder(responseString);
//处理字符串,删去两个空格与3.0
sb.deleteCharAt(11);
sb.deleteCharAt(15);
sb.delete(22, 26);
String result=sb.toString();
Log.d("hap.zhu", "success status="+status+",responseString="+result);
//利用GSON工具解析
Gson gson=new Gson();
QueryResultForWeatherFirst weatherResult=gson.fromJson(result, QueryResultForWeatherFirst.class);
Log.d("hap.zhu", "weatherResult="+weatherResult);

}
Log显示的结果如下

返回的天气数据原始值



处理HeWeather头字符值后数据值



用GSON成功解析,将数据变为一个个对象值



下面是我一整天的劳动成果,实体类一览图





当然名字是我用中式英语取的,大家可以自行取名,只要里面的属性名不变就行啦~~下载链接如右,实体类下载链接,希望大家可以体谅下我的吐血之作,赏赐我一点积分,谢谢大家啦,当然也可以自己去网上在线生成实体类,看个人喜好啦~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: