【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;
    }
发布了49 篇原创文章 · 获赞 46 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/mingtiannihao0522/article/details/102989778