在使用fastjson进行序列化时,可能需要根据实际需求过滤掉某些字段,以避免将敏感信息或不必要的字段发送到客户端。fastjson提供了多种灵活的方式来实现这一需求。以下整理了fastjson序列化时过滤字段的几种常用方法。
方法一:使用fastjson的注解
最直接且便捷的方式是在实体类的字段上使用@JSONField
注解,并设置serialize = false
属性。这样,在将对象转换为JSON字符串时,该字段将不会被包含在内。
public class Entity {
private String field1;
@JSONField(serialize = false)
private String field2;
private String field3;
private String field4;
}
方法二:使用JAVA的transient关键字
在Java中,transient
关键字用于声明一个实例变量不应该被序列化。将transient
关键字应用于实体类的字段上,可以确保该字段在序列化过程中被忽略。但请注意,这种方式不仅影响FastJson的序列化,还会影响其他所有基于Java序列化的操作。
public class Entity {
private String field1;
private transient String field2;
private String field3;
private String field4;
}
方法三:使用FastJson的属性名过滤器
FastJson提供了SimplePropertyPreFilter
类,允许通过指定属性名来过滤字段。可以排除或包含特定的字段。
排除特定字段
单个字段
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getExcludes().add("field2");
String jsonString = JSONObject.toJSONString(entity, filter);
多个字段
//使用List<String>也可以
ImmutableSet<String> fieldList =utableSet.<String>builder()
.add("field2")
.add("field3")
.build();
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getExcludes().addAll(fieldList);
String jsonString = JSONObject.toJSONString(entity, filter);
包含特定字段
如果需要保留的字段较少,也可以反向操作,只包含特定的字段。
单个字段
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getIncludes().add("field2");
String jsonString = JSONObject.toJSONString(entity, filter);
多个字段
//使用List<String>也可以
ImmutableSet<String> fieldList =utableSet.<String>builder()
.add("field2")
.add("field3")
.build();
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getIncludes().addAll(fieldList);
String jsonString = JSONObject.toJSONString(entity, filter);
或者简写:
SimplePropertyPreFilter filter = new SimplePropertyPreFilter("field2", "field3");
String jsonString = JSONObject.toJSONString(entity, filter);
方法四:使用FastJson的属性过滤器
通过实现PropertyFilter
接口的apply
方法,可以自定义过滤规则。这种方法最为强大,因为它允许根据字段名、字段值或其他条件来决定是否包含某个字段。
PropertyFilter profilter = new PropertyFilter() {
@Override
public boolean apply(Object object, String name, Object value) {
if (name.equals("field2")) {
return false; // 排除SEX字段
}
return true;
}
};
String jsonString = JSON.toJSONString(entity, profilter);
如果是Java 8及以上版本,可以使用lambda表达式来简化代码:
PropertyFilter profilter = (object, name, value) -> !name.equals("field2");
String jsonString = JSON.toJSONString(entity, profilter);
总结
fastjson提供了多种灵活的方式来过滤序列化时的字段,包括使用注解、Java的transient
关键字、属性名过滤器和自定义属性过滤器。根据实际需求选择最合适的方法,可以有效地控制序列化结果,保护敏感信息,减少数据传输量。