SpringBoot之FastJson实现封装的Json数据指定字段属性隐藏小工具

背景:

       在开发项目中发现有个需求,那就是传输的Json数据中在字段值为空或者int属性值为0的时候自动实现该字段值的隐藏,然后传输,便于接收服务的处理,我们将会采用FastJson来实现该功能。

还有就是在使用FastJson的时候发现传输的时候有个问题,那就是如果对象字段的属性是String类型,那么如果为空值的时候,就是没有赋值,在传输的时候会自动的隐藏该字段,所以问题就比较简单了,现在判断int类型字段就可以了,因为int字段不赋值默认为0进行传输。

下面第二部分重点说明。

步骤:

首先:测试代码如下所示,核心部分就是在需要过滤字段的地方进行一下判断。

apply函数参数分别表示对象,要过滤的属性字段,以及字段的值。
    @Test
    void test4() {
        Book book = new Book();
        book.setId(1);
        book.setName("gcg");
        book.setPrice("20");
        System.out.println("过滤前的对象属性:" + JSON.toJSONString(book));
        PropertyFilter profilter = new PropertyFilter() {

            @Override
            public boolean apply(Object object, String name, Object value) {
                if (name.equalsIgnoreCase("name") && value.equals("gcg")) {
                    return false;
                }
                return true;
            }
        };
        System.out.println("过滤后的对象属性:" + JSON.toJSONString(book, profilter));
    }

测试结果如下:

过滤前的对象属性:{"id":1,"name":"gcg","price":"20"}
过滤后的对象属性:{"id":1,"price":"20"}

二. 升级相关fastJson的过滤功能:(原理和上面差不多,但是我们采用的是容器的概念,将过滤器函数放在容器中,在使用的业务中自己进行相关的使用就可以了)

 

首先就是容器部分代码:(这个就是需要过滤的字段有int类型的温度和cycle值)

package com.guobiao.demo.utils.commonFunc;

import com.alibaba.fastjson.serializer.PropertyFilter;
import org.springframework.cglib.SpringCglibInfo;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

/**
 * @Description: 该类是对FastJson的序列化PropertyFilter实现类
 * @Param:
 * @return:
 * @Author: 作者
 * @Date: 2020/11/4
 */
@Component
public class PropertyFilterImp implements PropertyFilter {

    @Override
    public boolean apply(Object object, String name, Object value) {
        if ((name.equalsIgnoreCase("temperature") && (value.equals(0))) || ((name.equalsIgnoreCase("cycle") && value.equals(0)))) {
            //false表示last字段将被排除在外
            return false;
        }
        return true;
    }
}

然后就是Book对象的代码:(一共涉及到3个int类型数据,两个string类型数据)

public class Book implements Serializable {
    /*
    //表示将字段id设置为隐藏,也就是说使用fastJson生成的Json字符串,不包含该字段的值。
    @JSONField(serialize = false)
     */
    @JSONField(name = "id")
    private int id;
    @JSONField(name = "name")
    private String Name;
    private String price;
    private int temperature;
    private int cycle;
}

最后就是测试代码:

PropertyFilterImp propertyFilterImp; 这个就是获取容器中的数据。
    @Autowired
    PropertyFilterImp propertyFilterImp;

    @Test
    void test4() {
        Book book = new Book();
        book.setId(1);
        book.setName("gcg");
        book.setTemperature(26);
        //     book.setPrice("20");
        System.out.println("过滤前的对象属性:" + JSON.toJSONString(book));
        JSONObject book2 = JSONObject.parseObject(JSON.toJSONString(book, propertyFilterImp));
        System.out.println("过滤后的对象属性:" + book2);
    }

测试结果:明显的可以看出对于过滤器函数需要处理的temperature和cycle字段,赋值的时候不被过滤,相反没有赋值的时候会进行过滤掉该字段。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值