全面總結Fastjson過濾字段、排除字段的5種方法(含示例)

1.經過註解指定不須要序列化的字段

在不須要序列化的字段,添加@JSONField(serialize = false)註解可進行排除。java

public class DontSerializeAnnotation {

	@JSONField(serialize = false)
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/** * 經過註解指定不須要序列化的字段:@JSONField(serialize = false) */
@Test
public void testDontSerializeAnnotation() {
	DontSerializeAnnotation guestUser = new DontSerializeAnnotation();
	guestUser.setId(2L);
	guestUser.setName("guest");
	System.out.println(JSON.toJSONString(guestUser));
}

複製代碼

執行結果:markdown

{"name":"guest"}
複製代碼

2.聲明爲transient的變量不進行序列化

若是被序列化的字段使用transient修飾,則不會被序列化。app

public class TransientObject {

    private Long id;
    private transient String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/** * 聲明爲transient的變量不進行序列化 */
@Test
public void testTransientObject() {
	TransientObject guestUser = new TransientObject();
	guestUser.setId(2L);
	guestUser.setName("guest");
	System.out.println(JSON.toJSONString(guestUser));
}
複製代碼

執行結果:ide

{"id":2}
複製代碼

3.使用屬性過濾器排除不須要序列化的字段

使用過濾器SimplePropertyPreFilter,能夠一次性設置1到多個須要過濾掉的字段。oop

3.1 過濾對象中的某個字段

public class User {

    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/** * 使用屬性過濾器排除不須要序列化的字段 */
@Test
public void testExcludeSingleFilter() {
	User guestUser = new User();
	guestUser.setId(2L);
	guestUser.setName("guest");
	
	SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
	filter.getExcludes().add("name"); // 排除字段名爲name的字段
	
	System.out.println(JSON.toJSONString(guestUser, filter));
}
複製代碼

執行結果:this

{"id":2}
複製代碼

3.2 過濾嵌套類中的相同名字的字段

Group中的User,參照上一小節。spa

public class Group {

    private Long id;
    private String name;
    private List<User> users = new ArrayList<User>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public void addUser(User user) {
        users.add(user);
    }
}

/** * 使用屬性過濾器排除不須要序列化的字段. * 對於嵌套多層的類,不一樣類中具備相同名稱的字段都會被過濾掉。 */
@Test
public void testExcludeEmbedFilter() {
	Group group = new Group();
	group.setId(0L);
	group.setName("admin");

	User guestUser = new User();
	guestUser.setId(2L);
	guestUser.setName("guest");

	User rootUser = new User();
	rootUser.setId(3L);
	rootUser.setName("root");

	group.addUser(guestUser);
	group.addUser(rootUser);

	SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
	filter.getExcludes().add("name");
	
	System.out.println(JSON.toJSONString(group, filter));
}
複製代碼

執行結果:code

{"id":0,"users":[{"id":2},{"id":3}]}
複製代碼

3.3 使用多個屬性過濾器排除不須要序列化的字段

若是隻想過濾特定類中的字段,能夠在建立過濾器的時候,指定對應類的class對象和字段。orm

下面示例,分別對Group和User建立一個過濾器,過濾掉不一樣的字段。對象

/** * 使用多個屬性過濾器排除不須要序列化的字段. */
@Test
public void testExcludeMultiFilter() {
	Group group = new Group();
	group.setId(0L);
	group.setName("admin");
	
	User guestUser = new User();
	guestUser.setId(2L);
	guestUser.setName("guest");
	
	User rootUser = new User();
	rootUser.setId(3L);
	rootUser.setName("root");
	
	group.addUser(guestUser);
	group.addUser(rootUser);
	
	// Group的過濾器,過濾掉id字段
	SimplePropertyPreFilter filter1 = new SimplePropertyPreFilter(Group.class);
	filter1.getExcludes().add("id");
	// User的過濾器,過濾掉name字段
	SimplePropertyPreFilter filter2 = new SimplePropertyPreFilter(User.class);
	filter2.getExcludes().add("name");
	
	System.out.println(JSON.toJSONString(group, new SimplePropertyPreFilter[] {filter1, filter2}));
}
複製代碼

執行結果:

{"name":"admin","users":[{"id":2},{"id":3}]}
複製代碼

4.使用屬性過濾器包含須要序列化的字段.

有些時候,咱們僅僅須要序列化個別字段,或者當須要排除的字段比序列化的字段還要多的時候,這時能夠使用包含而非排除的過濾器。

/** * 使用屬性過濾器包含須要序列化的字段. */
@Test
public void testIncludeMultiFilter() {
	Group group = new Group();
	group.setId(0L);
	group.setName("admin");
	
	User guestUser = new User();
	guestUser.setId(2L);
	guestUser.setName("guest");
	
	User rootUser = new User();
	rootUser.setId(3L);
	rootUser.setName("root");
	
	group.addUser(guestUser);
	group.addUser(rootUser);
	
	// Group只序列化id和users
	SimplePropertyPreFilter filter1 = new SimplePropertyPreFilter(Group.class, "id", "users");
	// User只序列化name
	SimplePropertyPreFilter filter2 = new SimplePropertyPreFilter(User.class);
	filter2.getIncludes().add("name");
	
	System.out.println(JSON.toJSONString(group, new SimplePropertyPreFilter[] {filter1, filter2}));
}
複製代碼

執行結果:

{"id":0,"users":[{"name":"guest"},{"name":"root"}]}
複製代碼

5.自定義屬性過濾規則

在某些特殊的場景下,以上簡單的排除或包含方式,並不能很好的知足實際的應用需求。

這時,能夠考慮經過自定義屬性過濾器,來實現過濾。這種實現方式很是靈活,能夠根據實際的需求進行實現。

能夠對類、字段名和字段值執行某種規則判斷,來決定是否須要進行序列化。

具體方法,是實現PropertyFilter接口中的apply方法,返回true表示包含該字段,返回false表示過濾掉。

/** * @author wenshao[szujobs@hotmail.com] */
public interface PropertyFilter extends SerializeFilter {

    /** * @param object the owner of the property. 字段所屬的對象 * @param name the name of the property. 字段名 * @param value the value of the property. 字段值 * @return true if the property will be included, false if to be filtered out */
    boolean apply(Object object, String name, Object value);
}
複製代碼
/** * 自定義屬性過濾規則,最靈活的一種實現字段和值過濾的方式。 */
@Test
public void testPropertyFilter() {
	Group group = new Group();
	group.setId(0L);
	group.setName("admin");
	
	User guestUser = new User();
	guestUser.setId(2L);
	guestUser.setName("guest");
	
	User rootUser = new User();
	rootUser.setId(3L);
	rootUser.setName("root");
	
	group.addUser(guestUser);
	group.addUser(rootUser);
	
	PropertyFilter filter = new PropertyFilter() {
        @Override
        public boolean apply(Object object, String name, Object value) {
        	//System.out.println(object + " " + name + " " + value);
            if (name.equals("name")) {
                return false; // 排除名爲name的字段
            }
            if (value.toString().equals("2")) {
            	return false; // 排除值爲2的字段
            }
            return true; // 包含該字段或值
        }
    };
    
    System.out.println(JSON.toJSONString(group, filter));
}
複製代碼

執行結果:

{"id":0,"users":[{},{"id":3}]}
複製代碼

---轉載本站文章請註明做者和出處 二進制之路(binarylife.icu),請勿用於任何商業用途---

我的博客:binarylife.icu/

公衆號:二進制之路

二進制之路

相關文章
相關標籤/搜索