JackSon返回值为null的字段

亦凉 2022-01-30 01:29 436阅读 0赞

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

背景

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

  1. jackson:
  2. default-property-inclusion: non_null

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

解决方法
  • 方案1:首先想到的是在类上加上@JsonInclude,但是这个注解并不能解决我的问题。因为有些代码不是用的class,值为null或者""的字段依旧会被过滤掉,比如下面的。@JsonInclude这个注解对Map,List这种数据结构不起作用。

    HashMap map = new HashMap<>();

    1. map.put("totalWeight", order.getTotalWeight());
    2. map.put("source", orderSoldTo.getFromRefType());
    3. map.put("shipToPhone", orderSoldTo.getShipToPhone());
    4. map.put("dropShip", order.getDropShip());
    5. map.put("queued", order.getIssueDate());
    6. 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 {

    1. private HashMap<String,Object> jasonIncludeHashMap=new HashMap<String,Object>();
    2. public void put(String key,Object value){
    3. jasonIncludeHashMap.put(key,value);
    4. }
    5. private boolean containsKey(String key){
    6. return jasonIncludeHashMap.containsKey(key);
    7. }
    8. private Object get(String key){
    9. return containsKey(key) ? jasonIncludeHashMap.get(key) : Integer.MIN_VALUE;
    10. }
    11. public Object getTotalWeight(){
    12. return get("totalWeight");
    13. }
    14. public Object getSource(){
    15. return get("source");
    16. }
    17. public Object getShipToPhone(){
    18. return get("shipToPhone");
    19. }
    20. public Object getDropShip(){
    21. return get("dropShip");
    22. }
    23. public Object getQueued(){
    24. return get("queued");
    25. }
    26. public Object getSalesReleased(){
    27. return get("salesReleased");
    28. }

    }

    class JsonIncldeValueFilter{

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

    }

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

测试结果
  1. "jasonIncludeHashMap": {
  2. "totalWeight": 0,
  3. "source": "",
  4. "shipToPhone": 0,
  5. "dropShip": null,
  6. "queued": " ",
  7. "creditRelDate": null
  8. }
吐槽

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

发表评论

表情:
评论列表 (有 0 条评论,436人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JackSon返回null字段

    说实话这个问题真的让我头疼,最终想到一个投机取巧的方法,下面且听我一一道来。 背景 因为mobile团队为了节省流量,所以架构组就把一些值为`null`或者`""`的字