写在前面,纪念我第一篇csdn博文:
大家好,我是一名在校生,接触计算机和CSDN都有几个年头了,却一直没有写博文。并不是自己不想写,相反,自己倒是一个挺喜欢总结与分享的人,而只是把一些文章写在了自己独立的博客上。最近由于一些原因,有了在CSDN写博客的想法,先把原来的一些文章转一下吧,以后会继续坚持。博文一般都是针对移动开发和移动安全的,希望各位多多支持,大牛们多多指点。
好了,博客旅程开始:
网上有很多json数据的接口,大家在开发中难免会用到,这里就介绍一下普通的json数据的获取与解析(带有数组[就是json数据中带有中括号“[ ]”]形式的json数据解析以及获取json中单个键值的方法见下篇博文)。
一、用Gson解析普通json数据
例如:服务器端返回的json数据格式如下:
{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"8","WD":"北风","WS":"3级","SD":"33%","WSE":"3","time":"00:40","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}}
若想获取json数据并能在Android程序相应位置显示,首先建立WeatherInfo类,以接收json返回的数据,类中包含与json数据一 一 对应的成员:
public class WeatherInfo {
private String city;
private String cityid;
private String temp;
private String WD;
private String WS;
private String SD;
private String WSE;
private String time;
private String isRadar;
private String Radar;
//以下为属性的get、set方法,以及返回字符串的方法,可在eclipse中右键自动添加。。。
}
再添加TodayWeather类,只有WeaherInfo类的一个成员:
public class TodayWeather {
WeatherInfo weatherinfo;
public WeatherInfo getWeatherinfo() {
return weatherinfo;
}
public void setWeatherinfo(WeatherInfo weatherinfo) {
this.weatherinfo = weatherinfo;
}
@Override
public String toString() {
return "TodayWeather [weatherinfo=" + weatherinfo + ", toString()=" + super.toString() + "]";
}
}
下面我们就要从网页中获得原始的json数据了,函数如下:
// 传入url,返回获得的json
private String connServerForResult(String url) {
//这里利用Apache的HttpClient实现Android客户端发送实体。
//Android集成了第三方开源项目-org.apache.http.client.HttpClient,减小了直接利用HTTP协议来实现的复杂性。
HttpGet httpRequest = new HttpGet(url);
String strResult = "";
//NetUtil是自定义的一个判断网络状态的类
if (NetUtil.getNetworkState(this) != NetUtil.NETWORN_NONE) {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpRequest);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
strResult = EntityUtils.toString(httpResponse.getEntity());
// System.out.println(strResult);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
return strResult;
}
代码中NetUtil类是判断网络状态常用的类,代码如下:
package com.example.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
public class NetUtil {
public static final int NETWORN_NONE = 0;
public static final int NETWORN_WIFI = 1;
public static final int NETWORN_MOBILE = 2;
public static int getNetworkState(Context context) {
ConnectivityManager connManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
// Wifi
State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
.getState();
if (state == State.CONNECTED || state == State.CONNECTING) {
return NETWORN_WIFI;
}
// 3G
state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
.getState();
if (state == State.CONNECTED || state == State.CONNECTING) {
return NETWORN_MOBILE;
}
return NETWORN_NONE;
}
}
获得json之后,利用谷歌的Gson解析:
// 使用Gson解析Json
private void parseTodayWeatherInfo(String result) {
mCurWeatherinfo = null;
if (!TextUtils.isEmpty(result) && !result.contains("页面不存在")) {
mGson = new Gson();
TodayWeather todayweather = mGson.fromJson(result, TodayWeather.class);
mCurWeatherinfo = todayweather.getWeatherinfo();
}
}
之前还要做两件事情:
1、添加全局变量:private Gson mGson;// 导入谷歌的Gson包,定义变量
private WeatherInfo mCurWeatherinfo;// WeatherInfo类对象
2、导入Google的jar包:gson-2.2.4.jar
上述代码中,重点就是:
TodayWeather todayweather = mGson.fromJson(result, TodayWeather.class);
该处是:Gson将json数据中与TodayWeather类中同名的属性(weatherinfo)后面的数据进行赋值,也就是先将{"city":"北京","cityid":"101010100","temp":"8","WD":"北风","WS":"3级","SD":"33%","WSE":"3","time":"00:40","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}赋值给weatherinfo,而weatherinfo又是个对象,继续解析,将json中的键值按照weatherinfo中的属性名称一 一对应赋值。从而得到:city="北京" cityid="101010100"......
上述函数的调用及向控件赋值的方法:
调用:
String url = "http://youraddress/101010100.html";
String weatherResult = connServerForResult(url);
parseTodayWeatherInfo(weatherResult);
使用:
cityTv.setText(mCurWeatherinfo.getCity());