您的位置:首页 > Web前端 > JavaScript

Json数据获取以及解析入门

2014-01-16 17:00 471 查看
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中用到的异常
了解完几个需要用的类之后,接下来看看需要解析的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数据中需要的端点进行解析就可以了,不需要所谓的从头到尾从上到下的一级一级滴进行解析。我一开始研究就进入了那个误区,着实很坑爹。希望对大家有所些些帮助吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: