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示例:
JSON解析分析:
首先新建一个实体类Emp,包含的属性有:id,name,salary,age,gender
然后解析JSON字符串并将解析结果放在List<Emp>集合中。然后就可以将数据有选择性的显示到View中。
5、调试技巧
JSON是一种高效的书写方式;然而,因为阅读原始JSON字符串很难,所以也很难调试解析问题。很多情况下,你解析的JSON来自于远程资源或者你根本不熟悉它,而且在调试时还需要显示它。因此,JSONObject和JSONArray都提供了重载的toString()方法,参数为一个整型,它会返回一个用缩进的打印漂亮的字符串数据,使之更容易理解。通常在一些麻烦的地方添加诸如myJSONObject.toString(2)这样的东西,可以省去很多烦恼。
不带参数的toString()效果
Log.i("TAG","jsonObject.toString()"+jsonObject.toString());
![](file:///C:/Users/Administrator/Documents/My%20Knowledge/temp/13a315ff-4ba9-48a5-9f38-2ae83d457e16_4_files/f8ed09b5-54d8-4aba-857d-3494502488a0.png)
带参数的toString(2)效果
Log.i("TAG","jsonObject.toString()"+jsonObject.toString(2));
应用程序需要解析从一个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());
![](file:///C:/Users/Administrator/Documents/My%20Knowledge/temp/13a315ff-4ba9-48a5-9f38-2ae83d457e16_4_files/f8ed09b5-54d8-4aba-857d-3494502488a0.png)
带参数的toString(2)效果
Log.i("TAG","jsonObject.toString()"+jsonObject.toString(2));
![](file:///C:/Users/Administrator/Documents/My%20Knowledge/temp/13a315ff-4ba9-48a5-9f38-2ae83d457e16_4_files/e5773d53-14f7-46ba-a7c5-eca842504317.png)
相关文章推荐
- Android中AsyncTask(异步任务)详解
- android中使用RecyclerView
- Android开发学习之路-指纹识别api初试
- Android 定位GPS的使用
- Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)
- Android真机调试试验
- android下数据库的创建
- Android五个进程等级(转)
- android - Support 包
- Android 地理位置Location服务之LocationManager,Geocoder详解
- Android支付宝支付设计开发
- android中关联第三方jar源码与Javadoc
- Android笔记---Intent实现Activity跳转
- Android项目中包名的改动
- android 常见系统广播
- Android学习心得第一课
- Android 手机截屏
- ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作
- 《Android源码设计模式》读书笔记 (11) 第11章 命令模式
- Android MediaPlayer Error -1004