【CodeReview】JSON取值空指针问题

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;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值