Gson解析json数据

23 篇文章 0 订阅

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>



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值