日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fastjson 不转某些字段_全面总结Fastjson过滤字段、排除字段的5种方法(含示例)...

發布時間:2024/9/27 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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种方法(含示例)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。