gson是谷歌推出的,除此之外还有阿里的FastJson,官方json和jackjson。下面通过一个实例来讲解使用gson来解析json数据:
1.先做好准备工作,在网上下载Gson的jar包,放到工程的libs(没有此目录的话自己建一个)目录下:
2.要解析的json数据格式如下,详细的json数据放在了文章的末尾,这里推荐大家使用HiJson来查看jason数据。另外,介绍一种获得json/xml数据的途径:在网上注册一个聚合数据的账号,申请免费的数据用来测试。
3,使用gson解析json数据的关键在于创建json数据所对应的JavaBean类,创建此类的技巧为:从外层到内层,对象作为上一层的参数,数组作为上一层的内部类,如果有多个节点相同的数组,只需创建一个。详细代码如下:
<span style="font-size:18px;">package day28_client_Gson_test2;
import java.util.ArrayList;
public class Car {
public String error_code;
public String reason;
//result节点是一个数组,封装到集合中
ArrayList<Result>result = new ArrayList<>();
//再把此数组作为内部类
public static class Result{
public String _id;
public String info;
//result节点下的stats节点又是一个数组
ArrayList<Stats>stats = new ArrayList<>();
public static class Stats{
public String _id;
public String lat;
public String lng;
}
}
}</span>
提示:创建此JavaBean对象需要注意两点,
1:内部类必须要用static(静态的)来修饰。
2:类的属性名必须跟json数据里面的key值相同,包括集合的名字。
4.使用gson工具类进行解析的java代码如下,因为代码中已经做了详细的解析,这里不在啰嗦:
<span style="font-size:18px;">package day28_client_Gson_test2;
import java.util.ArrayList;
import com.google.gson.Gson;
import day28_client_Gson_test2.Car.Result;
import day28_client_Gson_test2.Car.Result.Stats;
public class TestCar {
public static void main(String[] args) {
//使用获取json数据的工具类来获取json数据,数据可以是本地的或网络上的
String netData = NetUtils.getNetData("http://localhost:8080/json/car.json");
//实例化Gson对象,前提是导入了gson的jar包
Gson gson = new Gson();
/*
* 调用fromJson方法,把获得的json数据转换为字符串
* 第一个参数为要转换的json数据
* 第二个参数为实体类
*/
Car car = gson.fromJson(netData, Car.class);
System.out.println(car.error_code + "\t" + car.reason);
/*
* result节点是一个数组,所以要通过遍历的方法取出其中的属性
* 技巧:实体类中的内部类都对应一个数组
*/
ArrayList<Result> result = car.result;
for (Result res : result) {
//获取result节点下的属性_id和info,并输出
System.out.println(res._id + "\t" + res.info);
//result节点下的stats又是一个数组,继续遍历
ArrayList<Stats> stats = res.stats;
for (Stats stat : stats) {
//获取stats节点下的属性_id、lat和lng,并输出
System.out.println(stat._id + "\t纬度:" + stat.lat + "\t经度:" + stat.lng);
}
}
}
}</span>
5.上面的java类使用了获取json数据的工具类,此类封装在了另一个java代码中:
<span style="font-size:18px;">package day28_client_Gson_test2;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 根据url获取网络上的json数据的工具类
* @author Administrator
* @urlAdd 获取json数据的地址
*/
public class NetUtils {
public static String getNetData(String urlAdd){
try {
URL url = new URL(urlAdd);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len;
while((len = is.read(buf))!=-1){
baos.write(buf, 0, len);
}
byte[] array = baos.toByteArray();
return new String(array, "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}</span>
6.下面是要解析的json数据:
<span style="font-size:14px;">{
"error_code": 0,
"reason": "请求成功!",
"result": [
{
"_id": "903路(兴华街公交站-沙门村)",
"info": "首末车:5:40-21:00;",
"stats": [
{
"_id": "兴华街公交站",
"lat": 34.719569,
"lng": 113.632867
},
{
"_id": "兴华街航海路",
"lat": 34.720998,
"lng": 113.632877
},
{
"_id": "兴华街政通路",
"lat": 34.725685,
"lng": 113.63289
},
{
"_id": "绿云小区",
"lat": 34.728922,
"lng": 113.632864
},
{
"_id": "兴华街汝河路",
"lat": 34.728902,
"lng": 113.635419
},
{
"_id": "汝河路淮北街",
"lat": 34.73037,
"lng": 113.63625
},
{
"_id": "大学路路寨",
"lat": 34.735588,
"lng": 113.644124
},
{
"_id": "大学路桃源路",
"lat": 34.740809,
"lng": 113.644053
},
{
"_id": "大学路中原路",
"lat": 34.746116,
"lng": 113.644154
},
{
"_id": "中原路大学路",
"lat": 34.747456,
"lng": 113.645423
},
{
"_id": "中原路京广路",
"lat": 34.74749,
"lng": 113.65055
},
{
"_id": "二七广场正兴街",
"lat": 34.752056,
"lng": 113.664866
},
{
"_id": "百货大楼",
"lat": 34.756745,
"lng": 113.666929
},
{
"_id": "人民公园东门",
"lat": 34.76138,
"lng": 113.66691
},
{
"_id": "新通桥",
"lat": 34.76433,
"lng": 113.66944
},
{
"_id": "紫荆山金水路西",
"lat": 34.76367,
"lng": 113.68111
},
{
"_id": "花园路口",
"lat": 34.768709,
"lng": 113.682087
},
{
"_id": "花园路黄河路",
"lat": 34.775084,
"lng": 113.68219
},
{
"_id": "花园路红专路",
"lat": 34.779702,
"lng": 113.68223
},
{
"_id": "花园路丰产路",
"lat": 34.783268,
"lng": 113.682073
},
{
"_id": "花园路农科路",
"lat": 34.792953,
"lng": 113.681792
},
{
"_id": "花园路鑫苑路",
"lat": 34.7997,
"lng": 113.68171
},
{
"_id": "省广播电视中心",
"lat": 34.805987,
"lng": 113.681593
},
{
"_id": "汽配大世界",
"lat": 34.81188,
"lng": 113.681373
},
{
"_id": "国基路花园路",
"lat": 34.81961,
"lng": 113.68187
},
{
"_id": "国基路沙门村",
"lat": 34.823412,
"lng": 113.682195
},
{
"_id": "沙门村",
"lat": 34.824186,
"lng": 113.673741
}
]
},
{
"_id": "903路(沙门村-兴华街公交站)",
"info": "兴华街公交站--沙门村 6:00-21:00;;票价1元,a/b/c/d卡有效。",
"stats": [
{
"_id": "沙门村",
"lat": 34.824148,
"lng": 113.674206
},
{
"_id": "花园路沙门村",
"lat": 34.823459,
"lng": 113.681904
},
{
"_id": "汽配大世界",
"lat": 34.81187,
"lng": 113.68129
},
{
"_id": "省广播电视中心",
"lat": 34.80388,
"lng": 113.68148
},
{
"_id": "花园路鑫苑路",
"lat": 34.79958,
"lng": 113.68157
},
{
"_id": "花园路农科路",
"lat": 34.792865,
"lng": 113.681652
},
{
"_id": "花园路关虎屯",
"lat": 34.785795,
"lng": 113.681616
},
{
"_id": "花园路丰产路",
"lat": 34.783197,
"lng": 113.681966
},
{
"_id": "花园路红专路",
"lat": 34.779535,
"lng": 113.682015
},
{
"_id": "花园路黄河路",
"lat": 34.77497,
"lng": 113.68204
},
{
"_id": "花园路口",
"lat": 34.769509,
"lng": 113.682002
},
{
"_id": "紫荆山金水路西",
"lat": 34.764121,
"lng": 113.679542
},
{
"_id": "新通桥",
"lat": 34.76448,
"lng": 113.6693
},
{
"_id": "人民公园东门",
"lat": 34.76124,
"lng": 113.6669
},
{
"_id": "百货大楼",
"lat": 34.75664,
"lng": 113.66691
},
{
"_id": "二七广场解放路",
"lat": 34.752733,
"lng": 113.664391
},
{
"_id": "中原路京广路",
"lat": 34.747585,
"lng": 113.650251
},
{
"_id": "中原路大学路",
"lat": 34.747619,
"lng": 113.644828
},
{
"_id": "大学路中原路",
"lat": 34.746212,
"lng": 113.643909
},
{
"_id": "大学路桃源路",
"lat": 34.740043,
"lng": 113.643969
},
{
"_id": "大学路路寨",
"lat": 34.73619,
"lng": 113.64398
},
{
"_id": "汝河路淮北街",
"lat": 34.72892,
"lng": 113.63649
},
{
"_id": "绿云小区",
"lat": 34.72893,
"lng": 113.632883
},
{
"_id": "兴华街政通路",
"lat": 34.725377,
"lng": 113.632868
},
{
"_id": "兴华街航海路",
"lat": 34.720945,
"lng": 113.632877
},
{
"_id": "兴华街公交站",
"lat": 34.7196,
"lng": 113.632825
}
]
}
]
}</span>