Json数据的获取和解析之前很早就实现了,但是一直没有时间做总结,今天刚好有这个时间了。所以做一下总结。
首先,android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External: 应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值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中用到的异常
{
"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数据中需要的端点进行解析就可以了,不需要所谓的从头到尾从上到下的一级一级滴进行解析。我一开始研究就进入了那个误区,着实很坑爹。希望对大家有所些些帮助吧!