花了几天的时间做了这个天气应用
通过聚合数据API来获取天气信息
那么第一步就是用获取网络数据然后通过GSON来解析JSON数据
按照聚合数据返回的json数据 如下
{
"reason": "查询成功",
"result": {
"data": {
"realtime": {
"city_code": "101210701",
"city_name": "温州", /*城市*/
"date": "2014-10-15", /*日期*/
"time": "09:00:00", /*更新时间*/
"week": 3,
"moon": "九月廿二",
"dataUptime": 1413337811,
"weather": { /*当前实况天气*/
"temperature": "19", /*温度*/
"humidity": "54", /*湿度*/
"info": "雾",
"img": "18" /*18是雾这种天气所对应的图片的ID,每种天气的图片需要您自己设计,或者请阅读
https://www.juhe.cn/docs/api/id/39/aid/117*/
},
"wind": {
"direct": "北风",
"power": "1级",
"offset": null,
"windspeed": null
}
},
"life": { /*生活指数*/
"date": "2014-10-15",
"info": {
"chuanyi": [ /*穿衣指数*/
"较舒适",
"建议着薄外套或牛仔衫裤等服装。年老体弱者宜着夹克衫、薄毛衣等。昼夜温差较大,注意适当增减衣服。"
],
"ganmao": [ /*感冒指数*/
"较易发",
"昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。"
],
"kongtiao": [ /*空调指数*/
"较少开启",
"您将感到很舒适,一般不需要开启空调。"
],
"wuran": [ /*污染指数*/
"良",
"气象条件有利于空气污染物稀释、扩散和清除,可在室外正常活动。"
],
"xiche": [ /*洗车指数*/
"较适宜",
"较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。"
],
"yundong": [ /*运动指数*/
"较适宜",
"天气较好,但风力较大,推荐您进行室内运动,若在户外运动请注意防风。"
],
"ziwaixian": [ /*紫外线*/
"中等",
"属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。"
]
}
},
"weather": [ /*未来几天天气预报*/
{
"date": "2014-10-15",
"info": {
"day": [ /*白天天气*/
"0", /*天气ID*/
"晴", /*天气*/
"24", /*高温*/
"东北风", /*风向*/
"3-4 级" /*风力*/
],
"night": [ /*夜间天气*/
"0",
"晴",
"13",
"东北风",
"3-4 级"
]
},
"week": "三",
"nongli": "九月廿二"
},
{
"date": "2014-10-16",
"info": {
"dawn": [
"0",
"晴",
"13",
"东北风",
"3-4 级"
],
"day": [
"0",
"晴",
"25",
"东北风",
"3-4 级"
],
"night": [
"1",
"多云",
"15",
"东北风",
"3-4 级"
]
},
"week": "四",
"nongli": "九月廿三"
},
{
"date": "2014-10-17",
"info": {
"dawn": [
"1",
"多云",
"15",
"东北风",
"3-4 级"
],
"day": [
"1",
"多云",
"26",
"东北风",
"3-4 级"
],
"night": [
"1",
"多云",
"16",
"东北风",
"3-4 级"
]
},
"week": "五",
"nongli": "九月廿四"
},
{
"date": "2014-10-18",
"info": {
"dawn": [
"1",
"多云",
"16",
"东北风",
"3-4 级"
],
"day": [
"1",
"多云",
"26",
"东风",
"3-4 级"
],
"night": [
"1",
"多云",
"18",
"东风",
"3-4 级"
]
},
"week": "六",
"nongli": "九月廿五"
},
{
"date": "2014-10-19",
"info": {
"dawn": [
"1",
"多云",
"18",
"东风",
"3-4 级"
],
"day": [
"1",
"多云",
"27",
"东风",
"3-4 级"
],
"night": [
"1",
"多云",
"19",
"东南风",
"3-4 级"
]
},
"week": "日",
"nongli": "九月廿六"
},
{
"date": "2014-10-20",
"info": {
"dawn": [
"1",
"多云",
"19",
"东南风",
"3-4 级"
],
"day": [
"1",
"多云",
"27",
"东南风",
"3-4 级"
],
"night": [
"2",
"阴",
"18",
"南风",
"3-4 级"
]
},
"week": "一",
"nongli": "九月廿七"
},
{
"date": "2014-10-21",
"info": {
"dawn": [
"2",
"阴",
"18",
"南风",
"3-4 级"
],
"day": [
"1",
"多云",
"26",
"东北风",
"3-4 级"
],
"night": [
"2",
"阴",
"17",
"",
"微风"
]
},
"week": "二",
"nongli": "九月廿八"
}
],
"pm25": { /*PM2.5*/
"key": "Wenzhou",
"show_desc": 0,
"pm25": {
"curPm": "97",
"pm25": "72",
"pm10": "97",
"level": 2,
"quality": "良",
"des": "可以接受的,除极少数对某种污染物特别敏感的人以外,对公众健康没有危害。"
},
"dateTime": "2014年10月15日09时",
"cityName": "温州"
},
"date": null,
"isForeign": 0
}
},
"error_code": 0
"reason": "查询成功",
"result": {
"data": {
"realtime": {
"city_code": "101210701",
"city_name": "温州", /*城市*/
"date": "2014-10-15", /*日期*/
"time": "09:00:00", /*更新时间*/
"week": 3,
"moon": "九月廿二",
"dataUptime": 1413337811,
"weather": { /*当前实况天气*/
"temperature": "19", /*温度*/
"humidity": "54", /*湿度*/
"info": "雾",
"img": "18" /*18是雾这种天气所对应的图片的ID,每种天气的图片需要您自己设计,或者请阅读
https://www.juhe.cn/docs/api/id/39/aid/117*/
},
"wind": {
"direct": "北风",
"power": "1级",
"offset": null,
"windspeed": null
}
},
"life": { /*生活指数*/
"date": "2014-10-15",
"info": {
"chuanyi": [ /*穿衣指数*/
"较舒适",
"建议着薄外套或牛仔衫裤等服装。年老体弱者宜着夹克衫、薄毛衣等。昼夜温差较大,注意适当增减衣服。"
],
"ganmao": [ /*感冒指数*/
"较易发",
"昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。"
],
"kongtiao": [ /*空调指数*/
"较少开启",
"您将感到很舒适,一般不需要开启空调。"
],
"wuran": [ /*污染指数*/
"良",
"气象条件有利于空气污染物稀释、扩散和清除,可在室外正常活动。"
],
"xiche": [ /*洗车指数*/
"较适宜",
"较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。"
],
"yundong": [ /*运动指数*/
"较适宜",
"天气较好,但风力较大,推荐您进行室内运动,若在户外运动请注意防风。"
],
"ziwaixian": [ /*紫外线*/
"中等",
"属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。"
]
}
},
"weather": [ /*未来几天天气预报*/
{
"date": "2014-10-15",
"info": {
"day": [ /*白天天气*/
"0", /*天气ID*/
"晴", /*天气*/
"24", /*高温*/
"东北风", /*风向*/
"3-4 级" /*风力*/
],
"night": [ /*夜间天气*/
"0",
"晴",
"13",
"东北风",
"3-4 级"
]
},
"week": "三",
"nongli": "九月廿二"
},
{
"date": "2014-10-16",
"info": {
"dawn": [
"0",
"晴",
"13",
"东北风",
"3-4 级"
],
"day": [
"0",
"晴",
"25",
"东北风",
"3-4 级"
],
"night": [
"1",
"多云",
"15",
"东北风",
"3-4 级"
]
},
"week": "四",
"nongli": "九月廿三"
},
{
"date": "2014-10-17",
"info": {
"dawn": [
"1",
"多云",
"15",
"东北风",
"3-4 级"
],
"day": [
"1",
"多云",
"26",
"东北风",
"3-4 级"
],
"night": [
"1",
"多云",
"16",
"东北风",
"3-4 级"
]
},
"week": "五",
"nongli": "九月廿四"
},
{
"date": "2014-10-18",
"info": {
"dawn": [
"1",
"多云",
"16",
"东北风",
"3-4 级"
],
"day": [
"1",
"多云",
"26",
"东风",
"3-4 级"
],
"night": [
"1",
"多云",
"18",
"东风",
"3-4 级"
]
},
"week": "六",
"nongli": "九月廿五"
},
{
"date": "2014-10-19",
"info": {
"dawn": [
"1",
"多云",
"18",
"东风",
"3-4 级"
],
"day": [
"1",
"多云",
"27",
"东风",
"3-4 级"
],
"night": [
"1",
"多云",
"19",
"东南风",
"3-4 级"
]
},
"week": "日",
"nongli": "九月廿六"
},
{
"date": "2014-10-20",
"info": {
"dawn": [
"1",
"多云",
"19",
"东南风",
"3-4 级"
],
"day": [
"1",
"多云",
"27",
"东南风",
"3-4 级"
],
"night": [
"2",
"阴",
"18",
"南风",
"3-4 级"
]
},
"week": "一",
"nongli": "九月廿七"
},
{
"date": "2014-10-21",
"info": {
"dawn": [
"2",
"阴",
"18",
"南风",
"3-4 级"
],
"day": [
"1",
"多云",
"26",
"东北风",
"3-4 级"
],
"night": [
"2",
"阴",
"17",
"",
"微风"
]
},
"week": "二",
"nongli": "九月廿八"
}
],
"pm25": { /*PM2.5*/
"key": "Wenzhou",
"show_desc": 0,
"pm25": {
"curPm": "97",
"pm25": "72",
"pm10": "97",
"level": 2,
"quality": "良",
"des": "可以接受的,除极少数对某种污染物特别敏感的人以外,对公众健康没有危害。"
},
"dateTime": "2014年10月15日09时",
"cityName": "温州"
},
"date": null,
"isForeign": 0
}
},
"error_code": 0
}
在添加了GSON jar之后
我们需要按照json格式来创建对应的 java bean
如下
public class DataBean {
public String reason;
public Result result;
public int error_code;
}
最外层就是这三个 对应各自的类型 这里注意返回的result 因为内部还有复杂的内容所以用一个类再包起来
我们看一下result对应的类
public class Result{
public Data data;
}
然后看看data
public class Data {
public Realtime realtime;
public Life life;
public List<Weather> weather;
public Pm25 pm25;
public String date;
public String isForeign;
}
下面就不依次列举了
这里获取json数据后可以通过下面这个网站类将其格式化一下 看得舒服多了
http://www.kjson.com/jsoneditor/ json在线编辑工具
然后就是获取网络数据了
public void getDataBean() {
new Thread(new Runnable() {
@Override
public void run() {
try {
//77ea626ec1eb28e6a026f511f0830c4a
URL url = new URL("http://op.juhe.cn/onebox/weather/query?cityname=" + checkName + "&key=" + appKey);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");//设置请求方法
conn.setConnectTimeout(5000);//设置连接超时
conn.setReadTimeout(5000);//设置响应超时,连接上了但是服务器迟迟不给响应
conn.connect();//连接服务器
int responseCode = conn.getResponseCode();//获取响应码
if (responseCode == 200) {
InputStream inputStream = conn.getInputStream();
result = StreamUtils.readFormStream(inputStream);
Log.d("AAAAAAAAAAAAAAAAAAAAAAA", result);
mHandler.sendEmptyMessage(0);
}
} catch (MalformedURLException e) {
//URL错误异常
e.printStackTrace();
} catch (IOException e) {
//网络错误异常
e.printStackTrace();
}
}
}).start();
}
这里封装了一个工具类 之前有用到过 将输入流转化为String
public class StreamUtils {
/*
* 将输入流读取成String后返回*/
public static String readFormStream(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1023];
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
String result = out.toString();
in.close();
out.close();
return result;
}
}
然后GSON只需要如下几行代码就可以将json数据装入设置好的javabean中如下
高亮就是最外层的类
Gson gson = new Gson();
java.lang.reflect.Type type = new TypeToken<
DataBean>() {
}.getType();
dataBean = gson.fromJson(result, type);
OK GSON解析数据就到这里