*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. Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...

  2. Hive的HQL语句及数据倾斜解决方案

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/51675005 作者: 朱培          ID ...

  3. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  4. 剑指Offer——完美+今日头条笔试题+知识点总结

    剑指Offer--完美+今日头条笔试题+知识点总结 情景回顾 时间:2016.9.28 16:00-18:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:完美世界笔试 ...

  5. PhysicsJoint

    1 PhysicsJoint的使用 T09Join.h #ifndef__T09Joint_H__ #define__T09Joint_H__ #include"T32.h" cl ...

  6. 小小聊天室 Python实现

    相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 ...

  7. Universal-Image-Loader 图片异步加载类库的使用

    这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...

  8. (一三〇)UITextField的光标操作扩展

    简介 在iOS开发中,有时候需要完全自主的定义键盘,用于完整的单词输入,例如计算机应用中,需要一次性的输入sin(,在移动光标时要完整的跳过sin(,在删除时也要完整的删除,这就需要对光标的位置进行精 ...

  9. Dynamics CRM 开启图表的3D效果展示

    CRM中的图表在我们的业务场景中用的很多,用户可以根据自己的实际需求来构建图表查看数据.我们平时看到的图表都是平面的,像下图中的这种,那有没有一种方式可以让展示3D效果看起来更立体呢,答案是可以的. ...

  10. Ubuntu 16.04 安装和使用QQ最简洁的方式

    推荐参考网址: 1  http://www.ubuntukylin.com/ 2  http://www.ubuntukylin.com/application/ Wine QQ 1  http:// ...