JSONObject,JSONArray,Integer.如果接口数据格式返回错误。或者其他原因导致不存在该字段。导致崩溃
比如:
list_operation.getJSONObject("code");
如果不存在code字段。取值时候回报空指针异常(java.lang.NullPointerException)。
类型错误,会报类转换异常(java.lang.ClassCastException)
优化:
可以判断是否存在该key,然后返回相应的取值:
list_operation.containsKey("code") ? object.getJSONObject("code") : new JSONArray();
问题:这样代码会造成冗杂。如下这段代码(仅示例):
builder.account_id(object.containsKey("account_id") ? object.getInteger("account_id") : 0)
.age(object.containsKey("age") ? object.getString("age") : "")
.avatar(object.containsKey("avatar") ? object.getString("avatar") : "")
.game(object.containsKey("game") ? object.getString("game") : "")
.handle_total(object.containsKey("handle_total") ? object.getString("handle_total") : "")
.handle_total_v2(object.containsKey("handle_total_v2") ? object.getString("handle_total_v2") : "")
.nickname(object.containsKey("nickname") ? object.getString("nickname") : "")
.origin_price(object.containsKey("origin_price") ? object.getString("origin_price") : "")
.price(object.containsKey("price") ? object.getInteger("price") : 0)
.sex(object.containsKey("sex") ? object.getString("sex") : "")
.star(object.containsKey("star") ? object.getString("star") : "")
.tags(jsonToArray(object.containsKey("tags") ? object.getJSONArray("tags") : new JSONArray()))
.unit(object.containsKey("unit") ? object.getString("unit") : "")
.voice(object.containsKey("voice") ? object.getString("voice") : "")
.voice_time(object.containsKey("voice_time") ? object.getString("voice_time") : "")
.ability_dan(object.containsKey("ability_dan") ? object.getString("ability_dan") : "")
.expert(object.containsKey("expert") ? object.getString("expert") : "")
.game_title(object.containsKey("game_title") ? object.getString("game_title") : "")
.is_banned(object.containsKey("is_banned") ? object.getString("is_banned") : "")
.be_banned(object.containsKey("be_banned") ? object.getString("be_banned") : "")
.vip(object.containsKey("vip") ? object.getInteger("vip") : 0)
.vip_badge(object.containsKey("vip_badge") ? object.getString("vip_badge") : "")
.level(object.containsKey("level") ? object.getInteger("level") : 0)
.is_recommend(object.containsKey("is_recommend") ? object.getString("is_recommend") : "N")
.activity_type(object.containsKey("activity_type") ? object.getString("activity_type") : "")
.activity_type_desc(object.containsKey("activity_type_desc") ? object.getString("activity_type_desc") : "")
.privilege(getPrivilege(object));
可以封装方法统一调用。JsonObject为例
/**
* 取值 空指针判断
*
* @param object
* @param key
* @return
*/
public static JSONObject getJsonObject(JSONObject object, String key) {
if (object == null) {
return new JSONObject();
}
if (object.containsKey(key)) {
return object.getJSONObject(key) == null ? new JSONObject() : object.getJSONObject(key);
}
return new JSONObject();
}
调用简介:
getJsonObject(object,"code");
但是类型错误无法避免。可以再取值时候主动捕获异常
如下示例:
/**
* 取值 空指针判断
*
* @param object
* @param key
* @return
*/
public static int getJsonInteger(JSONObject object, String key) {
int value;
if (object.containsKey(key)) {
try {
value = object.getInteger(key);
} catch (Exception e) {
e.printStackTrace();
value = 0;
}
return value;
}
return 0;
}