在开发项目中发现有个需求,那就是传输的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"}
首先就是容器部分代码:(这个就是需要过滤的字段有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;
}
测试
@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);
}