JackSon返回值为null的字段

说实话这个问题真的让我头疼,最终想到一个投机取巧的方法,下面且听我一一道来。

背景

因为mobile团队为了节省流量,所以架构组就把一些值为null或者""的字段给过滤掉了。
至于是怎么过滤掉值为null或者""的字段的方法如下。在application-local.yml里面加入如下全局配置

  jackson:
    default-property-inclusion: non_null

其实人家的这个要求也很合理,但是web团队有些数据是否展示的逻辑是根据API是否返回该字段来控制的,如果不返回字段就不显示了,所以就出问题了。

解决方法
  • 方案1:首先想到的是在类上加上@JsonInclude,但是这个注解并不能解决我的问题。因为有些代码不是用的class,值为null或者""的字段依旧会被过滤掉,比如下面的。@JsonInclude这个注解对Map,List这种数据结构不起作用。
		HashMap<String, Object> map = new HashMap<>();
        map.put("totalWeight", order.getTotalWeight());
        map.put("source", orderSoldTo.getFromRefType());
        map.put("shipToPhone", orderSoldTo.getShipToPhone());
        map.put("dropShip", order.getDropShip());
        map.put("queued", order.getIssueDate());
        map.put("creditRelDate", order.getCreditRelDate());
  • 方案2:手写一个JasonIncludeHashMap,思路主要是重写put,get,containsKey方法,然后结合@JsonInclude(value = JsonInclude.Include.CUSTOM)注解,定义一个Filter。
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = JsonIncldeValueFilter.class, contentFilter = JsonIncldeValueFilter.class)
public class JasonIncludeHashMap {

    private HashMap<String,Object> jasonIncludeHashMap=new HashMap<String,Object>();

    public void put(String key,Object value){
        jasonIncludeHashMap.put(key,value);
    }

    private boolean containsKey(String key){
        return jasonIncludeHashMap.containsKey(key);
    }

    private Object get(String key){
        return containsKey(key) ? jasonIncludeHashMap.get(key) : Integer.MIN_VALUE;
    }

    public Object getTotalWeight(){
        return get("totalWeight");
    }

    public Object getSource(){
        return get("source");
    }

    public Object getShipToPhone(){
        return get("shipToPhone");
    }

    public Object getDropShip(){
        return get("dropShip");
    }

    public Object getQueued(){
        return get("queued");
    }

    public Object getSalesReleased(){
        return get("salesReleased");
    }
}

class JsonIncldeValueFilter{

    @Override
    public boolean equals(Object obj) {
        return (obj instanceof Integer) && ((Integer) obj == Integer.MIN_VALUE);
    }
}


然后将HashMap替换成JasonIncludeHashMap,就可以实现当值为null""的时候,字段不会被过滤掉,可以正常返回。

测试结果
"jasonIncludeHashMap": {
      "totalWeight": 0,
      "source": "",
      "shipToPhone": 0,
      "dropShip": null,
      "queued": " ",
      "creditRelDate": null
    }
吐槽

以后写代码真的要用class,尽量的避免HashMap这种手动拼接的行为,真实让人头疼。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值