zoukankan      html  css  js  c++  java
  • FastJson序列化时过滤字段(属性)的方法总结

    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         }
    复制代码
  • 相关阅读:
    js正则匹配以某字符串开始字符串
    vue+vue-resource+vue-cookie随笔
    [考试反思]1001csp-s模拟测试(b):逃离
    [考试反思]0929csp-s模拟测试55:消逝
    [考试反思]0928csp-s模拟测试54:转瞬
    [考试反思]0927csp-s模拟测试53:沦陷
    [考试反思]0926csp-s模拟测试52:审判
    [考试反思]0924csp-s模拟测试51:破碎
    Function:凸包,决策单调性,题意转化,单峰函数三分,离线处理
    土兵占领:二分答案,最大流
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/13602198.html
Copyright © 2011-2022 走看看