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 ...
随机推荐
- Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...
- Hive的HQL语句及数据倾斜解决方案
[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/51675005 作者: 朱培 ID ...
- ListView下拉刷新上拉加载更多实现
这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...
- 剑指Offer——完美+今日头条笔试题+知识点总结
剑指Offer--完美+今日头条笔试题+知识点总结 情景回顾 时间:2016.9.28 16:00-18:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:完美世界笔试 ...
- PhysicsJoint
1 PhysicsJoint的使用 T09Join.h #ifndef__T09Joint_H__ #define__T09Joint_H__ #include"T32.h" cl ...
- 小小聊天室 Python实现
相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 ...
- Universal-Image-Loader 图片异步加载类库的使用
这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...
- (一三〇)UITextField的光标操作扩展
简介 在iOS开发中,有时候需要完全自主的定义键盘,用于完整的单词输入,例如计算机应用中,需要一次性的输入sin(,在移动光标时要完整的跳过sin(,在删除时也要完整的删除,这就需要对光标的位置进行精 ...
- Dynamics CRM 开启图表的3D效果展示
CRM中的图表在我们的业务场景中用的很多,用户可以根据自己的实际需求来构建图表查看数据.我们平时看到的图表都是平面的,像下图中的这种,那有没有一种方式可以让展示3D效果看起来更立体呢,答案是可以的. ...
- Ubuntu 16.04 安装和使用QQ最简洁的方式
推荐参考网址: 1 http://www.ubuntukylin.com/ 2 http://www.ubuntukylin.com/application/ Wine QQ 1 http:// ...