在这里我将介绍解析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 {AddressComponent.java
//调用百度地图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;
}
}
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