在不須要序列化的字段,添加@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"}
複製代碼
若是被序列化的字段使用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}
複製代碼
使用過濾器SimplePropertyPreFilter,能夠一次性設置1到多個須要過濾掉的字段。oop
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}
複製代碼
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}]}
複製代碼
若是隻想過濾特定類中的字段,能夠在建立過濾器的時候,指定對應類的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}]}
複製代碼
有些時候,咱們僅僅須要序列化個別字段,或者當須要排除的字段比序列化的字段還要多的時候,這時能夠使用包含而非排除的過濾器。
/** * 使用屬性過濾器包含須要序列化的字段. */
@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"}]}
複製代碼
在某些特殊的場景下,以上簡單的排除或包含方式,並不能很好的知足實際的應用需求。
這時,能夠考慮經過自定義屬性過濾器,來實現過濾。這種實現方式很是靈活,能夠根據實際的需求進行實現。
能夠對類、字段名和字段值執行某種規則判斷,來決定是否須要進行序列化。
具體方法,是實現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/
公衆號:二進制之路