java bean对象转换json对象时过滤空值

在将数据库获取的Java Bean对象转换为JSON时,空值和空字符串可能会影响项目的运行和错误排查。本文介绍了使用json-lib包进行处理的方法,包括创建JsonConfig对象、定制PropertyFilter,通过PropertyFilter接口的apply方法决定是否过滤特定属性,从而实现对JSON输出中空值的过滤。示例代码展示了如何实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于从数据库获取到的总是有空值或者”“的情况,而且从数据库获取到数据封装到java中,再转换成json数据格式,这种事情已经司空见惯了。
但是在某些特定的场合下json数据中空值或者”“的会影响项目的运行,查错的情况下也不直观。例如下面这种情况下
这里写图片描述
上图只是json的一小部分,后面还有很多没有截出来。写过微信公众号的应该知道这是自定义菜单的json数据格式,但是其中有些属性是多余的。所以空值和”“还有空list都需要从该json数据段中去除。


我处理json是用json-lib包。以下是获取数据到输出的步骤

  • 从数据库中获取javabean数据
    这里写图片描述
  • 创建JsonConfig对象
    这里写图片描述
  • 创建PropertyFilter匿名内部类,并设定规则
    这里写图片描述
  • 把PropertyFilter对象填充到JsonConfig对象中
    这里写图片描述
  • javabean转换为json
    这里写图片描述
  • 输出json
    这里写图片描述

其中创建PropertyFilter匿名内部类,并设定规则是重中之重,PropertyFilter是一个接口,里面只有一个apply方法,返回值是boolean,返回true时过滤该属性。PropertyFilter源码如下
这里写图片描述
JsonObject中调用的代码如下
这里写图片描述
当没有设置JsonPropertyFilter时,跳过该代码段。如果设置了,就调用apply方法,返回false时,跳过该代码段,当apply方法返回true时跳出该循环(即不解析该属性,直接处理下一属性)。

完整代码

@Test
    public void createMenuTest(){
        CustomMenuService customMenuService = (CustomMenuService) context.getBean("customMenuService");
        List<CustomMenuCreate> menus = customMenuService.getCreateMenu();

        //设置过滤json格式
        JsonConfig jsonConfig = new JsonConfig();
        PropertyFilter filter = new PropertyFilter() {
                public boolean apply(Object object, String fieldName, Object fieldValue) {
                if(fieldValue instanceof List){
                    List<Object> list = (List<Object>) fieldValue;
                    if (list.size()==0) {
                        return true;
                    }
                }
                return null == fieldValue || "".equals(fieldValue);
                }
        };
        jsonConfig.setJsonPropertyFilter(filter);

        JSONArray jsonArray = JSONArray.fromObject(menus,jsonConfig);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("button", jsonArray);

        System.out.println(jsonArray.toString());
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值