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);
}
...
}
}
温故而知新,可以为师矣.
getJSONObject与optJSONObject的区别,结合源码分析的更多相关文章
- DirectStream、Stream的区别-SparkStreaming源码分析02
转http://hadoop1989.com/2016/03/15/KafkaStreaming/ 在Spark1.3之前,默认的Spark接收Kafka数据的方式是基于Receiver的,在这之后的 ...
- lodash源码分析之NaN不是NaN
暗恋之纯粹,在于不求结果,完全把自己锁闭在一个单向的关系里面. --梁文道<暗恋到偷窥> 本文为读 lodash 源码的第五篇,后续文章会更新到这个仓库中,欢迎 star:pocket-l ...
- Java源码分析:关于 HashMap 1.8 的重大更新(转载)
http://blog.csdn.net/carson_ho/article/details/79373134 前言 HashMap 在 Java 和 Android 开发中非常常见 而HashMap ...
- 死磕 java并发包之AtomicInteger源码分析
问题 (1)什么是原子操作? (2)原子操作和数据库的ACID有啥关系? (3)AtomicInteger是怎么实现原子操作的? (4)AtomicInteger是有什么缺点? 简介 AtomicIn ...
- [源码解析]HashMap和HashTable的区别(源码分析解读)
前言: 又是一个大好的周末, 可惜今天起来有点晚, 扒开HashMap和HashTable, 看看他们到底有什么区别吧. 先来一段比较拗口的定义: Hashtable 的实例有两个参数影响其性能:初始 ...
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...
- ArrayList和Vector区别及源码
本文基于jdk1.7 1.ArrayList 类图来自:作者 Java3y 源码分析: 1.1 属性 1.2 构造方法 Arrays.copyOf源码: 1.3 trimToSize方法, 修改当前 ...
- Spark源码分析:多种部署方式之间的区别与联系(转)
原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...
- SqlAlchemy 中操作数据库时session和scoped_session的区别(源码分析)
原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalch ...
随机推荐
- MPAndroidChart图形联动
MPAndroidChart图形联动 本篇基于博客MPAndroidChart的K线图上添加均线,两个MPAndroidChart是有联动效果的 原理 获取正在滑动的Chart的触摸事件,将事件同步给 ...
- ICL Auto Vectorization
简介 此文简单介绍如何使用intel c++编译器实现向量化加速. 全文如下安排: base : 待优化的源代码. vectorization : 第一个向量化版本. aligned : 内存对其对向 ...
- Android底层开发经验
最近看到一个博客,他的博文虽然是转载的,但源作者肯定对底层的理解可谓是非常透彻,一副思维导图就可以将整个重要体系建立起来,非常适合大家学习.学习不单单只要有代码,生动有趣更重要.在此推荐一波: htt ...
- [转]django-registration quickstart
Basic configuration and use--------------------------- Once installed, you can add django-registrati ...
- 【SSH系列】-- Hibernate持久化对象的三种状态
在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- Spring MVC Junit4 单元测试 JunitTest
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/config/spring3/ap ...
- UNIX网络编程——原始套接字的魔力【上】
基于原始套接字编程 在开发面向连接的TCP和面向无连接的UDP程序时,我们所关心的核心问题在于数据收发层面,数据的传输特性由TCP或UDP来保证: 也就是说,对于TCP或UDP的程序开发,焦点在Dat ...
- 06 Activity隐式跳转
一,隐式跳转 某个Activity 需要在清单文件配置某个Activity如下信息: 注意:category要和action一起用 action:制定一个活动 在隐式跳转的可以用到 category ...
- 【一天一道LeetCode】#107. Binary Tree Level Order Traversal II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源: htt ...