android中使用Gson解析普通json数据(致我的第一篇博文)

写在前面,纪念我第一篇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());



你可能感兴趣的:(Android开发)