*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. CDH 5.x 集群安装及卸载

    上次写了CDH安装测试总结,由于那个博客篇幅略长, 但是主要集中在第二章,所以单独把CDH安装.卸载这块的内容拉出来在一篇记录一下. 一.搭建远程yum源 1.启动http服务: service ht ...

  2. Programming In Scala笔记-第五章、Scala中的变量类型和操作

    这一章的一些基础性的东西,主要包括Scala中的基本变量类型,以及相关的一些操作符. 一.简单类型 下表中列出Scala语言中的基本类型,以及其字节长度,其中Byte, Short, Int, Lon ...

  3. XML Condition And

    <Target Name="CustomBuildStep" Condition="'@(CustomBuildStep)' != '' and '$(Select ...

  4. Unity UGUI图文混排源码(四) -- 聊天气泡

    这里有同学建议在做聊天气泡时,可以更改为一张图集对应多个Text,这样能节省资源,不过我突然想到每个Text一个图集,可以随时更换图集,这样表情图更丰富一些,于是我就先将现有的聊天demo改为了聊天气 ...

  5. 无网络环境下安装Dynamics CRM

    在安装CRM时会需要很多的组件支持,没有这些组件是没法安装的,一般我们都是选择机器联网后在线安装,但也有特殊情况确实不能联网的,可参考这篇文章 https://blogs.msdn.microsoft ...

  6. 指令汇B新闻客户端开发(二) 主页面布局

    这个主页面采用了一个开源框架SlidingMenu,这个可以在git上面下载.把这些下载下来的文件import我们的eclipse中,用我们的项目去加载这个library,在这个过程中很有可能会报错, ...

  7. JDBC-数据库的编程(一)

    因为我使用的mysql数据库客户端程序是workBench,所以会用workBench来进行讲解. create table tbl_user( id int(11) unsigned not nul ...

  8. Android View框架总结(六)View布局流程之Draw过程

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52236145 View的Draw时序图 ViewRootImpl.p ...

  9. NDK在windows下的开发环境搭建及开发过程

    在Android应用的开发工程中,不管是游戏还是普通应用,都时常会用到.so即动态链接库,关于.so是什么玩意儿,有什么好处,这个大家可以在网上查一下,本人不做过多解释..so本是linux下的文件类 ...

  10. ORA-28001: the password has expired 详解 不用重启项目

    大早上正式库提示: Oracle提示错误消息ORA-28001: the password has expired 解决办法: 1.利用SYSDBA权限登陆: 2.查看账户信息:select user ...