检查json字符串用gson反序列化之后是否有空对象

15 篇文章 0 订阅

使用场景

gson转换之后的对象如果不经过检查就使用,很容易导致空指针错误。json中的每一个数据都单独做检查,就会导致代码冗长,而且不利于维护,因此我做了一个小工具,用来在gson对字符串转换完成之后进行校验,避免在使用对象的过程中出现问题。

原理

主要利用的是反射的方法,使用getClass()函数获得对象的类型,getDeclaredFields函数可以获得这个类的所有成员变量,包括私有的变量,如果这个类没有任何变量,那么返回null,判断也就结束了。如果不为null,则对fields中的每一个元素进行检查,如果为null,则返回false,如果不是null,则把访问权限打开再进行判断。如果field类型是基础类型,不用进行后面的判断,因为会有默认值,永远不会为null。如果是字符串,则判断转换之后的字符串是否为空。如果是List,也就是json中的数组,按照同样的方法判断,因为大多数情况下,list里面跟的都是json字符串,反序列化之后,就是内部类,所以需要对list中的每个元素都进行递归调用,判断内部类中是否有空对象。最后就是json中value是另外 一个json了,也是进行递归调用,判断是否会返回false。

代码

/**
     * created by 二仪式
     * @param object
     * @return
     */
public static boolean checkNull(Object object) {
        try {
            if (object == null) return false;
            Class cls = object.getClass();
            System.out.println("class=" + cls.toString());
            if (cls.equals(String.class)) return true;
            Field[] fields = cls.getDeclaredFields();
            if (fields == null) return true;
            for (int i = 0; i < fields.length; i++) {
                if (fields[i] == null) {
                    System.out.println("field为空 " + cls.getTypeName());
                    return false;
                }
                fields[i].setAccessible(true);
                if (fields[i].getType().isPrimitive()) continue;
                if (fields[i].getType() == String.class) {
                    String temp = (String) fields[i].get(object);
                    if (temp == null) {
                        System.out.println("字符串为空 " + (fields[i].getName()));
                        return false;
                    }
                }
                if (fields[i].getType().equals(List.class)) {
                    List<Object> objs = (List<Object>) fields[i].get(object);
                    if (objs==null){
                        System.out.println("list为空对象 " + (fields[i].getName()));
                        return false;
                    }

                    for (int j = 0; j < objs.size(); j++) {
                        if (!checkNull(objs.get(j))) {
                            System.out.println("list中有空对象 " + (fields[i].getName()));
                            return false;
                        }
                    }
                }
                if (!checkNull(fields[i].get(object))) {
                    System.out.println("自定义对象有空对象 " + (fields[i].getName()));
                    return false;
                }
                System.out.println("field type =" + (fields[i].getName()));
            }
        } catch (Exception e) {
            System.out.println("exception = " + e);
            e.printStackTrace();
            return false;
        }
        return true;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值