Json数据获取以及解析入门

        Json数据的获取和解析之前很早就实现了,但是一直没有时间做总结,今天刚好有这个时间了。所以做一下总结。

      

        首先,android的json解析部分都在包org.json下,主要有以下几个类: 

JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:   应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的KeyValue被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在KeyValue之间是以逗号","分隔。Value的类型包括:BooleanJSONArrayJSONObjectNumberString或者默认值JSONObject.NULL object 。

JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

JSONArray它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:     [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,     get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

JSONTokener:json解析类 
JSONException:json中用到的异常 
          了解完几个需要用的类之后,接下来看看需要解析的Json数据是什么样子的:
 {
    "cityList": [
        {
            "lev": 1,
            "id": "7",
            "zoom": 8,
            "lat": 25.22,
            "lng": 116.75,
            "message": "龙岩市水文局2013年07月14日00时发布洪水蓝色预警"
        },
             {
            "lev": 1,
            "id": "8",
            "zoom": 8,
            "lat": 26.38,
            "lng": 117.39,
            "message": "三明市水文局2013年07月14日08时发布洪水蓝色预警"
        }
    ],
    "stcdList": [
        {
            "lev": 1,
            "cityId": "8",
            "message": "尤溪大桥2013年07月14日08时发布洪水蓝色预警(已解除)",
            "stnm": "尤溪大桥",
            "id": "144",
            "isRelease": 1,
            "content": "三布洪水蓝色预警。预计来0.5-1小时最高水位将达105.4m左右,超警戒0.9m,请有关部门注意防范。",
            "lng": 118.198,
            "lat": 26.184,
            "isFlash": 0
        },
           {
            "lev": 1,
            "cityId": "9",
            "message": "浦城2013年06月29日11时发布洪水蓝色预警(已解除)",
            "stnm": "浦城",
            "id": "140",
            "isRelease": 1,
            "content": "06月29日11时发布洪水蓝色预警。预计浦城站2013年6月29日20时洪峰水位226.0~226.2m,超警戒1.0~1.2m。",
            "lng": 118.534,
            "lat": 27.918,
            "isFlash": 0
        },
        {
            "lev": 1,
            "cityId": "9",
            "message": "2013年06月29日10时发布洪水蓝色预警(已解除)",
            "stnm": "水蓝山",
            "id": "139",
            "isRelease": 1,
            "content": "发布洪水蓝色预警。预计建溪上站2013年6月29日11时洪峰水位202.1~202.3m,超警戒0.1~0.3m。",
            "lng": 118.032,
            "lat": 27.752,
            "isFlash": 0
        }
    ]
}


         那么,接下来就直接上代码吧,发现时间久了,有点知识点竟然忘记了。
      
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

public class JsonParse {
	public ArrayList<Double> lat = new ArrayList<Double>();// 北纬
	public ArrayList<Double> lng = new ArrayList<Double>();// 东经
	public ArrayList<Integer> lev = new ArrayList<Integer>();// 预警等级
	public ArrayList<String> stnm = new ArrayList<String>();// 站名
	public ArrayList<String> content = new ArrayList<String>();// 预警内容
	public ArrayList<Integer> isRelease = new ArrayList<Integer>();// 是否解除,1为是

	public void JsonParser() {
		try {
			// 获取Json数据
			String url = "http://www.fjsw.gov.cn/webPages/hsyjsys/json_hsyjHistory.aspx";
			JSONObject jsonObject;
			jsonObject = doGet(url);

			// 解析Json数据
			JSONArray jsonArray = jsonObject.getJSONArray("stcdList");

			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject json = (JSONObject) jsonArray.opt(i);
				lat.add(json.getDouble("lat"));
				lng.add(json.getDouble("lng"));
				lev.add(json.getInt("lev"));
				stnm.add(json.getString("stnm"));
				isRelease.add(json.getInt("isRelease"));
				content.add(json.getString("content"));
				 Log.i("JSONParse-->", "lat :" + json.getDouble("lat"));
				 Log.i("JSONParse-->", "lng :" + json.getDouble("lng"));
				 Log.i("JSONParse-->", "lev :" + json.getInt("lev"));
				 Log.i("JSONParse-->", "stnm :" + json.getString("stnm"));

			}

		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	public static JSONObject doGet(String url) {
		try {
			String result = null;
			DefaultHttpClient httpClient = new DefaultHttpClient();
			HttpGet request = new HttpGet(url);
			HttpResponse response = httpClient.execute(request);
			result = EntityUtils.toString(response.getEntity());
			JSONObject object = new JSONObject(result);
			// Log.i("HttpActivity", result);
			return object;

		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
}
代码很简单,其中通过http去获取url的json数据之后,直接对json数据中需要的端点进行解析就可以了,不需要所谓的从头到尾从上到下的一级一级滴进行解析。我一开始研究就进入了那个误区,着实很坑爹。希望对大家有所些些帮助吧!

你可能感兴趣的:(android,json,解析json)