Gson解析复杂的json数据

最近公司需要调用百度地图的API的WebService,调用百度地图的API的WebService返回的数据格式有两种:XML和JSON。由于JSON解析简便,原先本来打算使用普通的json解析方法即JsonObject和JsonArray的配合使用,这对于解析小数据的json数据还是比较实用,但是当解析json数据比较复杂的时候这种方法就显得比较吃力也比较麻烦了,如果大家感兴趣的话网上有大量的实例可以到网上去看看。

       在这里我将介绍解析json数据的另外一种方法就是通过Gson解析,对于解析比较简单的json数据我就不介绍了来一个比较复杂一点的json数据,如下面我们要解析的一个json数据:


String json = {"a":"100","b":[{"b1":"b_value1","b2":"b_value2"}, {"b1":"b_value1","b2":"b_value2"}],"c": {"c1":"c_value1","c2":"c_value2"}}

如果使用JsonObject和JsonArray的配合起来使用也是可以解析的但是解析起来就比较麻烦了,如果使用Gson解析就比较简单了,首先我们需要定义一个序列化的Bean,这里采用内部类的形式,这样比较容易看得清晰些

首先我们需要定义一个序列化的Bean,这里采用内部类的形式,看起来会比较清晰一些:

public class JsonBean {
                         public String a;
                         public List<B> b;
                         public C c;

                         public static class B {

                                      public String b1;

                                  public String b2;
                        }
    
                        public static class C {
                                 public String c1;
                                 public String c2;
                       }
              }

很多时候大家都是不知道这个Bean是该怎么定义,这里面需要注意几点:
             1、内部嵌套的类必须是static的,要不然解析会出错;
             2、类里面的属性名必须跟Json字段里面的Key是一模一样的;
             3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List<B> b,而只用{}嵌套的就定义为 public C c,
                  具体的大家对照Json字符串看看就明白了,不明白的我们可以互相交流,本人也是开发新手!


             Gson gson = new Gson();
             java.lang.reflect.Type type = new TypeToken<JsonBean>() {}.getType();
             JsonBean jsonBean = gson.fromJson(json, type);

然后想拿数据就很简单啦,直接在jsonBean里面取就可以了!
       如果需要解析的Json嵌套了很多层,同样可以可以定义一个嵌套很多层内部类的Bean,需要细心的对照Json字段来定义哦。

       下面我将以一个具体的列子来说明通过Gson方式解析复杂的json数据
1.将要解析的数据如下面的格式

{
    "status": 0,
    "result": {
        "location": {
            "lng": 113.37048902013,
            "lat": 23.140752999774
        },
        "formatted_address": "广东省广州市天河区中山大道西",
        "business": "棠下,天河公园,五山",
        "addressComponent": {
            "adcode": "440106",
            "city": "广州市",
            "country": "中国",
            "direction": "",
            "distance": "",
            "district": "天河区",
            "province": "广东省",
            "street": "中山大道西",
            "street_number": "",
            "country_code": 0
        },
        "poiRegions": [],
        "sematic_description": "广东邮电职业技术学院-教学楼西南68米",
        "cityCode": 257
    }
}

2.必须定义如下一些的javaBean数据:(根据以上的JSON数据定义需要获取信息的bean)

BaiduMapJson.java

public class BaiduMapJson {

	//调用百度地图API的状态码
	/**
	 * 调用成功
	 */
	public static Integer STATUS_SUCC = 0;
	
	private String status;
	private Result result;
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public Result getResult() {
		return result;
	}
	public void setResult(Result result) {
		this.result = result;
	}

	
}
AddressComponent.java
public class AddressComponent {
	private String adcode;
	private String city;
	private String country;
	private String direction;
	private String distance;
	private String district;
	private String province;
	private String street;
	private String street_number;
	private String country_code;
	
	public String getAdcode() {
		return adcode;
	}
	public void setAdcode(String adcode) {
		this.adcode = adcode;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
	public String getDirection() {
		return direction;
	}
	public void setDirection(String direction) {
		this.direction = direction;
	}
	public String getDistance() {
		return distance;
	}
	public void setDistance(String distance) {
		this.distance = distance;
	}
	public String getDistrict() {
		return district;
	}
	public void setDistrict(String district) {
		this.district = district;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getStreet_number() {
		return street_number;
	}
	public void setStreet_number(String street_number) {
		this.street_number = street_number;
	}
	public String getCountry_code() {
		return country_code;
	}
	public void setCountry_code(String country_code) {
		this.country_code = country_code;
	}
}

Result.java

public class Result {
	
	private AddressComponent addressComponent;

	public AddressComponent getAddressComponent() {
		return addressComponent;
	}
	public void setAddressComponent(AddressComponent addressComponent) {
		this.addressComponent = addressComponent;
	}
}

然后具体的javabean定义好了就将解析数据了,下面是我使用Apache HttpClient调用百度地图WebService的逆地址编码服务的示例:

		HttpClient httpclient = new DefaultHttpClient();
		String Url = "http://api.map.baidu.com/geocoder/v2/?ak=" + baidumap_key
				+ "&location=" + latitude + "," + longitude
				+ "&output=json&pois=0";
			HttpGet httpRequest = new HttpGet(Url);
			HttpResponse httpResponse = httpclient.execute(httpRequest);

			if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
				HttpEntity entitiy = httpResponse.getEntity();
				String messBody = EntityUtils.toString(entitiy);
				if (messBody != null && messBody.length() >0) {
					Gson gson = new Gson();
					//通过经纬度获取筛选信息
					BaiduMapJson mapJson = gson.fromJson(messBody, BaiduMapJson.class);
 }
			}

以下是参考学习地址: http://blog.csdn.net/tkwxty/article/details/34474501

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值