*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);
                            }
 ...
                        }
                }

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

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

  1. DirectStream、Stream的区别-SparkStreaming源码分析02

    转http://hadoop1989.com/2016/03/15/KafkaStreaming/ 在Spark1.3之前,默认的Spark接收Kafka数据的方式是基于Receiver的,在这之后的 ...

  2. lodash源码分析之NaN不是NaN

    暗恋之纯粹,在于不求结果,完全把自己锁闭在一个单向的关系里面. --梁文道<暗恋到偷窥> 本文为读 lodash 源码的第五篇,后续文章会更新到这个仓库中,欢迎 star:pocket-l ...

  3. Java源码分析:关于 HashMap 1.8 的重大更新(转载)

    http://blog.csdn.net/carson_ho/article/details/79373134 前言 HashMap 在 Java 和 Android 开发中非常常见 而HashMap ...

  4. 死磕 java并发包之AtomicInteger源码分析

    问题 (1)什么是原子操作? (2)原子操作和数据库的ACID有啥关系? (3)AtomicInteger是怎么实现原子操作的? (4)AtomicInteger是有什么缺点? 简介 AtomicIn ...

  5. [源码解析]HashMap和HashTable的区别(源码分析解读)

    前言: 又是一个大好的周末, 可惜今天起来有点晚, 扒开HashMap和HashTable, 看看他们到底有什么区别吧. 先来一段比较拗口的定义: Hashtable 的实例有两个参数影响其性能:初始 ...

  6. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  7. ArrayList和Vector区别及源码

    本文基于jdk1.7 1.ArrayList 类图来自:作者 Java3y 源码分析: 1.1 属性 1.2 构造方法 Arrays.copyOf源码: 1.3 trimToSize方法, 修改当前  ...

  8. Spark源码分析:多种部署方式之间的区别与联系(转)

    原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...

  9. SqlAlchemy 中操作数据库时session和scoped_session的区别(源码分析)

    原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalch ...

随机推荐

  1. RunLoop总结:RunLoop的应用场景(三)

    今天要讲的RunLoop的应用场景可能太简单了,所以东西比较少.因为跟UITableView.UICollectionView等的滑动优化有关,就顺便总结一下会影响UITableView.UIColl ...

  2. [CSDN_Markdown] Markdown基本语法

    简介 本文介绍Markdown的基本使用方法: 使用标题 加粗.斜体 分割线 列表 引用 我写博客一般将可以独立的内容分节,每一节有一个标题,标题的字体应该与正文的字体有点区别.两个相邻节之间使用分割 ...

  3. iOS开发基础之开发证书的说明和发布

    1.首先通过钥匙串访问--证书助理--从证书颁发机构请求证书--填写证书信息(邮箱,常用名称,存储到磁盘)--存储为(自定义名称.certSigningReuqest,简称CSR文件,只是为了提交到苹 ...

  4. Ubuntu14下安装svn仓库,以及权限配置

    sudo apt-get update 接下来安装svn apt-get install subversionapt-get install libapache2-svn 检查svn是否安装成功了: ...

  5. Python 函数参数*expression 之后为什么只能跟关键字参数

    python 为何要设计这种? 正确: def f(a=2,b=2,c=3): return a+b+c print(f(*(1,1),c=1)) 错误: def f(a=2,b=2,c=3): re ...

  6. 物料分类新增&更新

    --新增 INV_ITEM_CATEGORY_PUB.Create_Category ( p_api_version IN NUMBER, p_init_msg_list IN VARCHAR2 DE ...

  7. Hadoop:Hadoop单机伪分布式的安装和配置

    http://blog.csdn.net/pipisorry/article/details/51623195 因为lz的linux系统已经安装好了很多开发环境,可能下面的步骤有遗漏. 之前是在doc ...

  8. FFmpeg源代码简单分析:av_find_decoder()和av_find_encoder()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  9. Android开发学习之路--RxAndroid之lambda

      RxJava的简单使用基本上也了解了,其实还有一个比较好玩的就是java8才有的lambda了. lambda在android studio下的环境搭建 下载java8   下面就来搭建下这个环境 ...

  10. windows下实现win32俄罗斯方块练手,编程的几点心得

    编程珠玑2阅读笔记: 1.使用c语言性能监视器,完成对代码的调优工作 2.关联数组:  拓扑排序算法,可以用于当存在遮挡的时候决定三维场景的绘制顺序. 3.小型算法中的测试与调试工具 脚手架程序:&l ...