一.JSON格式以及JSON数据字符的解析方式
首先,我们需要知道JSON的格式。那么JSON的格式是怎么样的呢?
{
“name”:“JY”,
“age”:22
}
这就是一个最简单的JSON格式例子。JOSN格式采用的是key:value的键值相对应来写的,key是字符串,value为key的值,它有String,number,boolean,array等类型。key之间用“,”来隔开。
JAVA中传统解析JSON一般有三种方式:
首先你的生成一个JSON字符串,你可以这样生成
public static String createJsonString(String key, Object value) {
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject.toString();
}
将JSON数据生成为
1.一个JavaBean,
2.一个List数组,
3.一个嵌套Map的List数组
在这里我推荐使用第一种方式(生成为一个JavaBean),因为在项目中一般需要对JSON数据中的key的value做一些处理,这时候JavaBean的好处就体现出来了,它相对于其他两种方式的使用更加灵活。
二.JSON之GSON
在android studio中有一个十分好用的插件,就是GsonFormat,它可以很方便的帮助我们将JSON数据字符串自动生成为一个JavaBean,用Gson来解析就很容易了。
当你在android studio安装好GsonFormat之后,使用步骤如下:
1.在Code中选中Generate
2.选中
3.将你获取到的JSON数据直接复制到里面去就可以一键生成你所需要的JavaBean
好,基础已经讲完。下面讲讲如何获取天气的JSON数据
三、接入和风天气api的天气预报demo
若想接入api,就需要一个app的key,这时候我们需要到和风天气的官网去注册一个账号,一般我们选个人开发者就好了,免费的api也算够我们测试使用。当然,如果你是公司项目使用需要更多的数据,你可以选择企业客户注册。
注册完成认证通过后你需要去控制台找到自己的认证key,因为api接入的参数中需要这个key
那么,我们应该怎么接入呢?别急嘛,人家有接入文档的嘛!
箭头所指的地方就是接入api的方式,parameters在下面有说明,自己可以根据自己的需要来接入,但是一定要有key
在这里,你可以将这个请求地址直接输入到浏览器中查看请求到的JSON数据是什么。不过,个人推荐使用postman来查看,因为不需要自己改格式,自动生成自己想要的格式,有没有觉得好方便。
好,直到现在,我们已经获取到我们需要的和风天气的JSON数据了,接下来就是如何在demo中将它生成为一个JavaBean以及解析它们了。
还记得我们前面说的android studio的插件GsonFormat嘛,对,没错,现在就是使用它的时候了.由于我当时是请求所有的免费天气api,所以代码很多很长,不过没关系,因为都不需要你去写这个代码,毕竟一键生成嘛,会用就行,对吧。
public class WeatherBean {
private List<HeWeather6Bean> HeWeather6;
public List<HeWeather6Bean> getHeWeather6() {
return HeWeather6;
}
public void setHeWeather6(List<HeWeather6Bean> HeWeather6) {
this.HeWeather6 = HeWeather6;
}
public static class HeWeather6Bean {
/**
* basic : {"cid":"CN101010100","location":"北京","parent_city":"北京","admin_area":"北京","cnty":"中国","lat":"39.90498734","lon":"116.4052887","tz":"+8.00"}
* update : {"loc":"2018-05-01 14:47","utc":"2018-05-01 06:47"}
* status : ok
* now : {"cloud":"0","cond_code":"504","cond_txt":"浮尘","fl":"18","hum":"26","pcpn":"0.0","pres":"1013","tmp":"21","vis":"10","wind_deg":"72","wind_dir":"东北风","wind_sc":"3","wind_spd":"14"}
* daily_forecast : [{"cond_code_d":"504","cond_code_n":"101","cond_txt_d":"浮尘","cond_txt_n":"多云","date":"2018-05-01","hum":"35","mr":"20:19","ms":"06:13","pcpn":"0.0","pop":"0","pres":"1015","sr":"05:16","ss":"19:09","tmp_max":"24","tmp_min":"13","uv_index":"6","vis":"20","wind_deg":"3","wind_dir":"北风","wind_sc":"4-5","wind_spd":"33"},{"cond_code_d":"101","cond_code_n":"100","cond_txt_d":"多云","cond_txt_n":"晴","date":"2018-05-02","hum":"18","mr":"21:19","ms":"06:49","pcpn":"0.0","pop":"0","pres":"1020","sr":"05:15","ss":"19:10","tmp_max":"24","tmp_min":"13","uv_index":"6","vis":"20","wind_deg":"210","wind_dir":"西南风","wind_sc":"3-4","wind_spd":"21"},{"cond_code_d":"100","cond_code_n":"100","cond_txt_d":"晴","cond_txt_n":"晴","date":"2018-05-03","hum":"20","mr":"22:14","ms":"07:28","pcpn":"0.0","pop":"0","pres":"1022","sr":"05:13","ss":"19:11","tmp_max":"24","tmp_min":"13","uv_index":"7","vis":"20","wind_deg":"177","wind_dir":"南风","wind_sc":"1-2","wind_spd":"4"}]
* lifestyle : [{"type":"comf","brf":"舒适","txt":"白天不太热也不太冷,风力不大,相信您在这样的天气条件下,应会感到比较清爽和舒适。"},{"type":"drsg","brf":"较舒适","txt":"建议着薄外套、开衫牛仔衫裤等服装。年老体弱者应适当添加衣物,宜着夹克衫、薄毛衣等。"},{"type":"flu","brf":"较易发","txt":"虽然温度适宜但风力较大,仍较易发生感冒,体质较弱的朋友请注意适当防护。"},{"type":"sport","brf":"较适宜","txt":"阴天,较适宜进行各种户内外运动。"},{"type":"trav","brf":"适宜","txt":"天气较好,风稍大,但温度适宜,总体来说还是好天气。这样的天气适宜旅游,您可以尽情享受大自然的风光。"},{"type":"uv","brf":"最弱","txt":"属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。"},{"type":"cw","brf":"较不宜","txt":"较不宜洗车,未来一天无雨,风力较大,如果执意擦洗汽车,要做好蒙上污垢的心理准备。"},{"type":"air","brf":"良","txt":"气象条件有利于空气污染物稀释、扩散和清除,可在室外正常活动。"}]
*/
private BasicBean basic;
private UpdateBean update;
private String status;
private NowBean now;
private List<DailyForecastBean> daily_forecast;
private List<LifestyleBean> lifestyle;
public BasicBean getBasic() {
return basic;
}
public void setBasic(BasicBean basic) {
this.basic = basic;
}
public UpdateBean getUpdate() {
return update;
}
public void setUpdate(UpdateBean update) {
this.update = update;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public NowBean getNow() {
return now;
}
public void setNow(NowBean now) {
this.now = now;
}
public List<DailyForecastBean> getDaily_forecast() {
return daily_forecast;
}
public void setDaily_forecast(List<DailyForecastBean> daily_forecast) {
this.daily_forecast = daily_forecast;
}
public List<Lifestyl