JackSon返回值为null的字段
说实话这个问题真的让我头疼,最终想到一个投机取巧的方法,下面且听我一一道来。
背景
因为mobile团队为了节省流量,所以架构组就把一些值为null
或者""
的字段给过滤掉了。
至于是怎么过滤掉值为null
或者""
的字段的方法如下。在application-local.yml
里面加入如下全局配置
jackson:
default-property-inclusion: non_null
其实人家的这个要求也很合理,但是web团队有些数据是否展示的逻辑是根据API是否返回该字段来控制的,如果不返回字段就不显示了,所以就出问题了。
解决方法
方案1:首先想到的是在类上加上
@JsonInclude
,但是这个注解并不能解决我的问题。因为有些代码不是用的class,值为null
或者""
的字段依旧会被过滤掉,比如下面的。@JsonInclude
这个注解对Map,List这种数据结构不起作用。HashMap
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这种手动拼接的行为,真实让人头疼。
还没有评论,来说两句吧...