FastJson序列化时过滤字段(属性)的方法

Posted pcheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastJson序列化时过滤字段(属性)的方法相关的知识,希望对你有一定的参考价值。

  FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法。

 

方法一、FastJson的注解

1     @JSONField(serialize = false)
2     private String name;

  最便捷,直接在实体的字段上加FastJson的注解serialize = false,转JSON字符串时就不会有该字段。

 

方法二、JAVA关键字

1     @JSONField(name = "AGE")
2     private transient String age;

  在实体字段前面,使用transient关键字,表示该字段不参与序列化,转JSON字符串时就可以忽略掉该字段。因为是JAVA关键字所以也会影响该字段其他序列化操作。

 

方法三、FastJson的属性名过滤器

1     SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
2     filter.getExcludes().add("PHONE");
3     System.out.println(JSONObject.toJSONString(u, filter));

  通过SimplePropertyPreFilter过滤器,来过滤指定的属性名,然后在转JSON的时候,带上过滤器参数即可。

  如果需要保留的参数比较少,也可以反过来,使用filter.getIncludes().add("PHONE");的方式来包含指定的字段。还可以直接在new的时候带上,这里是可变参数,所以可以同时指定多个,即如下这种写法:

1     SimplePropertyPreFilter filter = new SimplePropertyPreFilter("PHONE", "SEX");

注:这里的字段名为转成JSON后的key,不是实体的属性名。如例子中为大写SEX,而不是小写的sex。

 

方法四、FastJson的属性过滤器

 1     PropertyFilter profilter = new PropertyFilter() 
 2         @Override
 3         public boolean apply(Object object, String name, Object value) 
 4             if (name.equals("SEX")) 
 5                 // false表示字段将被排除在外
 6                 return false;
 7             
 8             return true;
 9         
10     ;
11     System.out.println(JSON.toJSONString(u, profilter));

  通过实现PropertyFilter接口的apply方法,来实现过滤属性,方法参数name即为字段的key,参数value即为字段的value,这种方式最强大,因为可以自定义具体过滤规则。方法返回false即为排除该字段。在转JSON的时候,带上过滤器参数即可。注:参数name指的字段名为转成JSON后的key,不是实体的属性名。如例子中为大写SEX,而不是小写的sex。

  如果是JAVA8的话。可以使用lambda表达式,更简洁,如下:

1     PropertyFilter profilter = (object, name, value) -> 
2         if (name.equals("SEX")) 
3             // false表示字段将被排除在外
4              return false;
5         
6         return true;
7     ;

 

附上实体类做参考:

 1         public class User 
 2 
 3         @JSONField(name = "ID")
 4         private String id;
 5 
 6         @JSONField(serialize = false)
 7         private String name;
 8 
 9         @JSONField(name = "AGE")
10         private transient String age;
11 
12         @JSONField(name = "SEX")
13         private String sex;
14 
15         @JSONField(name = "PHONE")
16         private String phone;
17         

 

以上是关于FastJson序列化时过滤字段(属性)的方法的主要内容,如果未能解决你的问题,请参考以下文章

Fastjson的SerializerFeature序列化属性

fastjson 过滤不需要序列化的属性

关于fastjson在序列化成JSON串时字段增加的问题

fastJson的@JSONField和jackson的@JsonProperty使用

为啥fastjson只支持序列化属性的get方法

java实体转json忽略属性