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),请勿用于任何商业用途---

公众号:二进制之路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qpython3h安装numpy_怎么装不上numpy?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼还是不行:(------------------------------------------------------------ /data/data/com.hipipal.qpyplus/files/bin/pip run on Mon Sep 21 11:04:21 2015 Downloading/unpacking numpy Running setup.py egg_info …

java随机整数_java如何产生1-8的整数随机数?

展开全部(int)(Math.random()*8)1或者Random r new Random(100);System.out.println(r.nextInt(8)1);Java产生随机数的两种方式62616964757a686964616fe58685e5aeb9313333656462611、通过Math.random()方法返回一个0到1之间的double值。2、通过Random类来产生一个随机数&#x…

java 1的阶乘之和_1-20的阶乘之和(java)

import java.math.BigInteger;public class Factorial {//2)求1&#xff01;2&#xff01;……20&#xff01;public static void main(String[] args){BigInteger sumBigInteger.ZERO;for(BigInteger iBigInteger.ONE;i.intValue()<20;){ii.add(BigInteger.ONE);sumsum.add…

java 音频解码_java视频音频解码-封装xuggle-实现多种视频编码格式解码扩展

手头做一个视频相关项目&#xff0c;但是客户发来的测试视频(avi格式) 现有组件不能解码。现有视频解码组件方案有基于JMF和opencv Jni调用。远远不能满足目前市面上玲琅满目的各种视频编码标准。进行检索 找到xuggler官方主页&#xff1a;http://www.xuggle.com/xuggler 对5.…

java 二叉树特点_二叉树的Java实现及特点总结

二叉树是一种非常重要的数据结构&#xff0c;它同时具有数组和链表各自的特点&#xff1a;它可以像数组一样快速查找&#xff0c;也可以像链表一样快速添加。但是他也有自己的缺点&#xff1a;删除操作复杂。我们先介绍一些关于二叉树的概念名词。二叉树&#xff1a;是每个结点…

java中session的作用_java中session的工作原理是什么?和Cookies有何区别?

现在大家学习的东西和以前大不相同了&#xff0c;越来越多的人倾向于去学习高新技术以获得更好的发展。java是很多人的第一选择。java中的知识还是很多的&#xff0c;今天就来为大家介绍一下。首先来说一下java中session的工作原理是什么?session的工作原理是客户端登录完成之…

java 大数四则运算_大数四则运算java(转)

1 //大数的四则运算2 #include 3 #include 4 #include 5 using namespace std;67 classBIGINTEGEROPERATIONS8 {9 private:10 static intCOMPARE(string number1, string number2)11 {12 intj;1314 int length1 number1.size();15 int length2 number2.size();1617 if(number1.…

http参数自动转换java接口参数设置_Springmvc请求参数类型转换器及原生api代码实例...

一、springmvc的xml配置文件xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframework.org/schema/context"xmlns:mvc"http://www.springframework.org/schema/mvc"xsi:schemaLocation"http://www.s…

java构建json_Java构造和解析Json数据的两种方法详解一

在www.json.org上公布了很多JAVA下的json构造和解析工具&#xff0c;其中org.json和json-lib比较简单&#xff0c;两者使用上差不多但还是有些区别。下面首先介绍用json-lib构造和解析Json数据的方法示例。用org.son构造和解析Json数据的方法详解请参见我下一篇博文&#xff1a…

python perl lisp,是否可能像python中的perl的lvalue或lisp的setf一样?

In lisp you can say:(setf (aref a 1) 5)In perl you can say:substr( $string, $start, $stop ) ~ s/a/b/gIs it possible something like this in python? I mean is it possible to use function result as a lvalue (as a target for assignment operation)?解决方案No.…

java final被覆盖_java中的final的使用

1、final类不能被继承&#xff0c;因此final类的成员方法没有机会被覆盖&#xff0c;默认都是final的。在设计类时候&#xff0c;如果这个类不需要有子类&#xff0c;类的实现细节不允许改变&#xff0c;并且确信这个类不会再被扩展&#xff0c;那么就设计为final类。(什么时候…

java jaxb注解xmlnull_java – 将空值表示为xml jaxb中的空元素

我强烈建议使用不存在节点或xsi&#xff1a;nil “true”属性来表示null.这最适用于模式验证(即< age />或< age>< / age>不是xsd&#xff1a;int类型的有效元素.但是,如果您不能在这里完成您的用例&#xff1a;标准JAXB行为import javax.xml.bind.annotatio…

wordcount.java_mapreduce中wordcount的java实现

用java模拟词频统计。有3个文件&#xff1a;text1: hello worldtext2:hello hadooptext3:hello mapreduce对上面的文件进行词频统计&#xff1a;结果应该是&#xff1a;hello:3; hadoop:1; world:1; mapreduce:1代码实现如下&#xff1a;package count;import java.ut…

java applog_java - 通过Logback登录到App Engine request_log - SO中文参考 - www.soinside.com

我当前部署的当前Logback配置如下(您可以说我的构想已耗尽...)&#xff1a;%-4relative [%thread] %-5level %logger{35} - %msgapplication.logWARNtech.provingground.dive_overwatch.etc.logging.enhancers.TestEnhancer%-4relative [%thread] %-5level %logger{35} - %msg查…

java生成pdf怎么合并行或者列_Java基础之PDF文件的合并

1、首先下载一个jar包&#xff1a;pdfbox-app-1.7.1.jar2、代码如下&#xff1a;package com;import java.io.File;import java.io.IOException;import org.apache.pdfbox.util.PDFMergerUtility;/*** PDF格式的图片合并**/public class PdfBox {private static String[] getFi…

java 迭代器的原理_java里Iterator的原理

Iterator&#xff1a;迭代器。其实就是集合取出元素的方式&#xff0c;每个容器的数据结构不一样&#xff0c;所以他们存取的方式不一样&#xff0c;具体事项方法不一样&#xff0c;具体实现方法不一样&#xff0c;每个集合都具备取出方式&#xff0c;对于取出这个动作不足以用…

Java里a和b哪个大_Java中 a+=b和a=a+b有什么区别?

在java语言中&#xff0c;ab和aab的主要区别是在运算的精度上。类似的有“- 、 * 、/ 、% ”&#xff0c;这里以ab 与 aab 举例说明一下。1.下面是一串代码&#xff0c;我们试一下aab的形式&#xff1a;public class TestDemo {public static void main(String[] args) {byte a…

java程序回滚之后在哪看_Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?...

代码流程前台点击"提交订单"进入BaseServlet.classBaseServlet.class分发至子类OrderServlet.class的submitOrder()方法submitOrder()调用Service层的submitOrder()方法.关键是Service层submitOrder()中使用了事务回滚. 这里调用了Dao层两个方法: fun01()和fun02(), …

java不进入for_为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?...

在阅读《阿里巴巴Java开发手册》时&#xff0c;发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约&#xff0c;具体内容如下&#xff1a;错误演示我们首先在 IDEA 中编写一个在 foreach 循环里进行 remove 操作的代码&#xff1a;import java.util.ArrayList;i…

mysql对测试如何_我如何对MySQL进行基准测试?

我目前正在使用MySQL工作台.我希望看到表中行数增加时性能的差异.我想专门测试并比较1000行,10,000行,100,000行,1,000,000行和10,000,000行.那么,是否有任何工具可以让我这样做并提供有关磁盘I / O,内存使用情况,CPU使用率和完成查询的时间的统计信息&#xff1f;解决方法:是.…