gson是谷歌推出的,除此之外还有阿里的FastJson,官方json和jackjson。下面通过一个实例来讲解使用gson来解析json数据:
1.先做好准备工作,在网上下载Gson的jar包,放到工程的libs(没有此目录的话自己建一个)目录下:
http://download.csdn.net/detail/ljw124213/9612607
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>