您的位置:首页 > 移动开发 > Android开发

Android JSON解析

2016-02-21 15:42 323 查看
1、问题

应用程序需要解析从一个API或者其他资源资源所返回的JSON格式的响应结果。例如从网络服务端返回的响应结果。

2、解决方案

安卓提供了一个非常高效的类集来解析JSON格式的字符串,即org.json解析类集。只需要用已经格式化的字符串数据生成一个新的JSONObject或者JSONArray,然后就可以使用一系列访问方法去获得这些对象中的原始数据或者内嵌的JSONObject和JSONArray数据。

3、实现机制

默认情况下,这个JSON解析器是非常严格的,也就意味着当遇到无效的JSON数据或者无效的key时会抛出一个异常。以“get” 开头的访问方法在请求的值找不到时会抛出一个JSONException。在某些情况下,这种机制可能不太好,一次就存在一套以“opt”为前缀的方法。这些方法在请求的key所对应的值找不到时会返回null而不是抛出一个异常。另外,它们中的很多方法都提供了重载版本,可以在失败时返回一个传入的参数而不是返回null。

4、案例:

JSON示例:

{"result":"ok",
"data": [ {"id":1, "name":"zhangsan", "salary":12345.0, "age":12, "gender":"m"},{"id":2, "name":"zhangsan", "salary":12345.0, "age":12, "gender":"m"}]}[/code]

JSON解析分析:
首先新建一个实体类Emp,包含的属性有:id,name,salary,age,gender
然后解析JSON字符串并将解析结果放在List<Emp>集合中。然后就可以将数据有选择性的显示到View中。

private List<Emp> getEmpsFromResult(String result) {
List<Emp> emps=new ArrayList<Emp>();
//利用jsonlib对result这个JSON字符串进行解析最终获得一个Emp集合
try {
//1)把一个JSON格式的字符串转换成JSONObject对象
JSONObject jsonObject=new JSONObject(result);
//2)提取jsonObject中我们感兴趣的部分
JSONArray jsonArray = jsonObject.getJSONArray("data");
//3)遍历jsonArray
for(int i=0;i<jsonArray.length();i++){
//4)jsonArray中每一个元素又是一个JSONObject对象
JSONObject obj = jsonArray.getJSONObject(i);
//5)创建了Emp对象
Emp emp=new Emp();
//6)从obj中提取值,为第5步创建的Emp对象的属性赋值
emp.setId(obj.getInt("id"));
emp.setName(obj.getString("name"));
emp.setSalary(obj.getDouble("salary"));
emp.setAge(obj.getInt("age"));
emp.setGender(obj.getString("gender"));
emps.add(emp);
}
} catch (JSONException e) {
e.printStackTrace();
}
return emps;
}


5、调试技巧

JSON是一种高效的书写方式;然而,因为阅读原始JSON字符串很难,所以也很难调试解析问题。很多情况下,你解析的JSON来自于远程资源或者你根本不熟悉它,而且在调试时还需要显示它。因此,JSONObject和JSONArray都提供了重载的toString()方法,参数为一个整型,它会返回一个用缩进的打印漂亮的字符串数据,使之更容易理解。通常在一些麻烦的地方添加诸如myJSONObject.toString(2)这样的东西,可以省去很多烦恼。

不带参数的toString()效果
Log.i("TAG","jsonObject.toString()"+jsonObject.toString());



带参数的toString(2)效果
Log.i("TAG","jsonObject.toString()"+jsonObject.toString(2));

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: