fastjson 不转某些字段_全面总结Fastjson过滤字段、排除字段的5种方法(含示例)...
1.通過注解指定不需要序列化的字段
在不需要序列化的字段,添加@JSONField(serialize = false)注解可進行排除。
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));
}
復制代碼
執行結果:
{"name":"guest"}
復制代碼
2.聲明為transient的變量不進行序列化
如果被序列化的字段使用transient修飾,則不會被序列化。
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));
}
復制代碼
執行結果:
{"id":2}
復制代碼
3.使用屬性過濾器排除不需要序列化的字段
使用過濾器SimplePropertyPreFilter,可以一次性設置1到多個需要過濾掉的字段。
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));
}
復制代碼
執行結果:
{"id":2}
復制代碼
3.2 過濾嵌套類中的相同名字的字段
Group中的User,參照上一小節。
public class Group{
private Long id;
private String name;
private List users = new ArrayList();
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 getUsers(){
return users;
}
public void setUsers(List 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));
}
復制代碼
執行結果:
{"id":0,"users":[{"id":2},{"id":3}]}
復制代碼
3.3 使用多個屬性過濾器排除不需要序列化的字段
如果只想過濾特定類中的字段,可以在創建過濾器的時候,指定對應類的class對象和字段。
下面示例,分別對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),請勿用于任何商業用途---
公眾號:二進制之路
總結
以上是生活随笔為你收集整理的fastjson 不转某些字段_全面总结Fastjson过滤字段、排除字段的5种方法(含示例)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福州3 2五年制计算机专业的学校,福州有
- 下一篇: php sql查询两个表语句,sql多表