Android getJSONObject与optJSONObject的区别结合源码分析

Android getJSONObject与optJSONObject的区别结合源码分析

json解析常见问题:

getJSONObject与optJSONObject的区别,下面结合源码和案例来分析当我们使用这两周方法来解析数据时,哪种比较好.

源码分析:

//使用getJSONObject时,如果返回的对象不是JSONObject,抛出JSONException异常 /** * Returns the value mapped by {@code name} if it exists and is a {@code * JSONObject}. * @throws JSONException if the mapping doesn't exist or is not a {@code * JSONObject}. */ public JSONObject getJSONObject(String name) throws JSONException { Object object = get(name); if (object instanceof JSONObject) { return (JSONObject) object; } else { throw JSON.typeMismatch(name, object, "JSONObject"); } } //使用optJSONObject时,当返回结果不是JSONObject时,这里不会抛异常,而是返回null /** * Returns the value mapped by {@code name} if it exists and is a {@code * JSONObject}. Returns null otherwise. */ public JSONObject optJSONObject(String name) { Object object = opt(name); return object instanceof JSONObject ? (JSONObject) object : null; }

结合项目代码分析使用场景

/** * 伪代码如下 **/ public class GetGoodsCollectListFactory { private String ERROR_MSG = "errorMsg"; private String ERROR_CODE = "errorCode"; private String RESULT = "result"; /** * 商品列表,解析获取到的json数据 * * @param param * @return */ public CollectListInfo getGoodsCollectListParse(String param) { String BOOK_MARK_BO_LIST = "favorGoodsList"; CollectListInfo collectList = new CollectListInfo(); List<CollectInfo> list = new ArrayList<CollectInfo>(); ResponseInfo responseInfo = null; CollectInfo info = null; try { // 请求获取json结果 JSONObject jsonObject = new JSONObject(HttpRequestClient.executeRequest(Constant.Url.GET_FOLLOW_GOODS_URL, param, true)); responseInfo = new ResponseInfo(); if (jsonObject.getBoolean(RESULT)) { responseInfo.setResult(true); JSONArray jsonArray = jsonObject.getJSONArray(BOOK_MARK_BO_LIST); collectList.setTotalPage(jsonObject.getInt(Constant.TOTAL_PAGE_NAME)); for (int i = 0; i < jsonArray.length(); i++) { info = collectList.getCollectInfo(); SONObject object = jsonArray.getJSONObject(i); JSONArray activityItemList = object.optJSONArray("activityItemList"); ArrayList<ActivityCollectInfo> activityCollectInfos = new ArrayList<ActivityCollectInfo>(); //因为object.optJSONArray("activityItemList");如果解析不到会直接返null if (activityItemList != null && activityItemList.size() > 0) { for (int j = 0; j < activityItemList.length(); j++) { //使用optJSONObject(i)会莫名解析不了下面数据:如optString("activityId")); // 当activityid为null时,不会抛错,但是下面的方法不走,因此换用getJSONObject(i); //JSONObject activityItemobj = activityItemList.optJSONObject(i); JSONObject activityItemobj = activityItemList.getJSONObject(i); ActivityCollectInfo activityCollectInfo = new ActivityCollectInfo(); activityCollectInfo.setActivityId(activityItemobj.optString("activityId")); activityCollectInfo.setActivityName(activityItemobj.optString("activityName")); activityCollectInfo.setActivityType(activityItemobj.optInt("activityType")); activityCollectInfo.setLargessFlag(activityItemobj.optInt("largessFlag")); activityCollectInfo.setLargessMoney(activityItemobj.optInt("largessMoney")); activityCollectInfo.setLargessNumber(activityItemobj.optInt("largessNumber")); activityCollectInfos.add(activityCollectInfo); } ... } }

温故而知新,可以为师矣.

时间: 2024-11-03 22:03:02

Android getJSONObject与optJSONObject的区别结合源码分析的相关文章

Android仿QQ5.0侧滑菜单ResideMenu源码分析

转自:http://blog.csdn.net/cym492224103/article/details/39177275 AndroidResideMenu github:https://github.com/SpecialCyCi/AndroidResideMenu  csdn:http://download.csdn.net/detail/cym492224103/7887801 先看看如何使用: 把项目源码下载下来导入工程,可以看到 ResideMenu为引用工程,再看看如何使用这个引用

Android源码分析-Alarm机制与Binder的交互

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/18448997 前言 本次给大家分析的是Android中Alarm的机制以及它和Binder的交互,所用源码为最新的Android4.4.因为Alarm的功能都是通过Binder来完成的,所以,介绍Alarm之前必须要先介绍下它是如何调用Binder来完成定时功能的.由于内容较多,本文会比较长,在文章结构安排上是这样的:首先简单介绍如何使用Alarm并给出其工作原理,接着分析

android中的设置选项对应的源码怎么修改

问题描述 android中的设置选项对应的源码怎么修改 想在android中的设置里面添加源码,想知道怎么进行修改:我指的是在源码包中 解决方案 参考:http://blog.csdn.net/yzx41099296/article/details/7337264 解决方案二: 把settings.java 代码导到开发工具里改就行,跟普通应用区别不大,关键是编译 pakages/apps/Settings.java 解决方案三: package/app/Settings 设置apk 的代码

Android 源码分析,FreeMind 是一件超级利器

Android 源码分析,FreeMind 是一件超级利器 思维导图软件 XMind 与 FreeMind 的对比 作者: 善用佳软 日期: 2012-04-17 分类: 1 文本办公, 1.5 思维导图 标签: mindmap 思维导图类软件中,最有影响力的开源免费软件是 FreeMind 和 XMind.FreeMind历史悠久,当属经典:XMind作为后起之秀,大有赶超之势.同作为免费.开源的思维导图解决方案,应如何选择/结合两款软件?本文试做分析,以供用户/开发者参考. 本文的分析基于W

深度理解Android InstantRun原理以及源码分析

深度理解Android InstantRun原理以及源码分析 @Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代

Appium Android Bootstrap源码分析之命令解析执行

通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在bootstrap中是以AndroidElement对象的方式呈现出来的,并且该控件对象会在AndroidElementHash维护的控件哈希表中保存起来.但是appium触发一个命令除了需要提供是否与控件相关这个信息外,还需要其他的一些信息,比如,这个是什么命令?这个就是我们这篇文章需要讨论的话题了. 下面我

基于android的无线视频监控,使用源码可是在pc端显示不了

问题描述 基于android的无线视频监控,使用源码可是在pc端显示不了 http://www.cnblogs.com/feifei1010/archive/2012/08/31/2664939.html在这里可以下载到源码这个是pc端开启服务器这个是android上运行不管是我输入0.0.0.0 还是127.0.0.1 我在pc端的程序看不到视频接入 请大神给予指导 谢谢了 解决方案 http://wenku.baidu.com/link?url=QOLtRQ2FoJRl80QAKsz8OaU

android源码分析,下载

问题描述 android源码分析,下载 最近想学一下android的源码,一些组件的底层实现,有没有有关google android sdk分析的资源,到哪里可以下载? 解决方案 http://blog.csdn.net/liyuanjinglyj/article/details/48056357 下载方法 解决方案二: Android2.3 源码下载并分析android下载源码下载 android 4.0.3 源码 解决方案三: 搜 "老罗的android之旅",他也出了书,分析源码

Android TreeView效果实现方法(附demo源码下载)_Android

本文实例讲述了Android TreeView效果实现方法.分享给大家供大家参考,具体如下: 应该说很多的操作系统上面都提供了TreeView空间,实现树形结构,这个树形结构的应用时很广泛的,而Google开发Android的时候出于Android手机是触摸屏幕的考虑,用手指操作树形结构很不方便,从这方面考虑没有提供TreeView的空间,而是只是提供了一个ExpandableListView:android中的二级树型Widget,虽然已经能满足不少的功能需求,例如书签的功能就可以使用这个控件