Jackson注解@JsonAutoDetect介绍篇之filter-程序员宅基地

技术标签: SpringBoot学习总结  Jackson  

1.默认怎样被序列化?

对象的属性被初次确定的过程称为自动检测:所有的成员方法和字段被查找。

   1.1.“Getter”方法:所有public,带返回值,符合“getXxx”(“isXxx”,如果返回boolean,被称为“isgetter”)

命名约定的成员方法被推测存在名字为“xxx”的属性(属性名按照bean命名约定推测,即开头大写字母转成小写)。

   1.2.field属性:所有public成员字段被推测要显示的属性,使用字段名字来序列化。

在相同的逻辑属性中同时存在getter和field的情况下。getter方法优先被使用(field被忽略)。

属性集被解析使用这个过程被认为是基本属性集。但自动检测过程本身可以进行不同的配置,并有多个注释和配置设置,

可以进一步改变属性的真实有效集序列化。

2.改变默认的自动检测:@JsonAutoDetect

如果默认的自动检测可见限制(field和成员方法必须public)不是你想要的,可以下面的方法很容易的改变。

   2.1.@JsonAutoDetect 注解定义在class上;属性”fieldvisibility”,“gettervisibility”和“isgettervisibility”定义

最小能见度需要包括属性(分别对应fields,getters ,is-getters).有许多可能性,例如,包含所有field属性并设为可见(@JsonAutoDetect(fieldVisibility=Visibility.ANY));或者取消getter方法的自动检测(@JsonAutoDetect(getterVisibility=Visibility.NONE)),也可以联合使用。注意这个注解(和其他Jachson注解一样)可以当作mix-in annotation 没有必要直接修改类型;可以添加到基类并应用所有子类。

   2.2.ObjectMapper.setVisibilityChecker()可以被使用自定义最小化可见检测。

改变自动检测变化最小能见度限制是一个容易的方式来增加一些属性(例如通过暴露所有的成员方法,类似XStream 和Gson默认的工作原理),或者静止任意一个和所有的自动检测(即使用明确的注释@JsonProperty 或者@JsonGetter )

例如,序列化所有fields(并且不使用getter方法),你可以如下操作:

@JsonAutoDetect(fieldVisibility=Visibility.ANY,getterVisibility=Visibility.NONE,isGetterVisibility=Visibility.NONE)
  public class FieldsOnlyBean {
    private String name; // will now be used instead of getName()
    public String getName() { throw new Error(); } // never used!
}

 

3.明确的忽视属性:@JsonIgnore, @JsonIgnoreProperties

首先设置可能存在的自动检测属性,再通过每个属性注解来进一步修改序列化。

  3.1.@JsonProperty (@JsonGetter, @JsonAnyGetter) 被用于暗示一个field和方法是属性的field和getter方法,即不是自动检测。

  3.2.@JsonIgnore 被用于强制禁止被包含,忽视自动检测(和其它的注解)

另外,类注解@JsonIgnoreProperties被用于例举属性的逻辑名并不被序列化;更简单的方式是通过mix-annotations而不是每个属性注解(尽管两者都可以通过mix-inannotations来使用)。

所以你可以:

  @JsonIgnoreProperties({ "internal" })
  public class Bean {
    public Settings getInternal() { ... } // ignored
    @JsonIgnore public Settinger getBogus(); // likewise ignored
    public String getName(); // but this would be serialized
  }

 

4.定义profiles用于动态过滤:JSON Views (@JsonView)

目前配置方法被静态的应用。意味着一个属性将总被包含(除了null-values特殊情况)或者排除。

JSON views 是一种定义更加动态的包含/排除策略的方式。定义包含属性的规则如下,通过关联的有属性逻辑view(用于标识符的类;允许继承使用view),使用@JsonView的注解;定义哪个view将被序列化。这通常是用来定义较小的“public”的属性,和更大的“private”或“confidential”的性质。见“用法的例子@jsonview wiki页面

5.忽略所有的属性通过定义类:@JsonIgnoreType

除了定义的规则在每个属性的基础上,有时是有意义防止任何自动检测给定的类型属性序列化。例如,许多框架中添加特定的访问类型会产生,它返回的对象是不可序列化的。

例如,当提到对象关系Mapper是总会添加"public Schema getSchema()"访问所有class的值,并且如果这些元数据不是序列化状态的一部分,我们通过添加@JonsIgnoreType注解来禁止包含。这也是最简单的使用mix-in annotations.

6.完全动态filtering:@JsonFilter

虽然JSON view允许某种动态过滤,过滤器仍然是静态定义.这意味着,它是唯一可能动态地选择从一组静态的views。JSON滤波器的一种实现方法完全动态过滤。这是做的方法是通过定义逻辑过滤器的属性和@Jsonfilter(“id”)的注解使用,但指定实际的滤波器(及其配置)使用objectwriter。通过filterproviders可完全定制的得到自己的过滤器,或基于简单的实现。查看详情JSON filter网页

7.过滤性能的最极端的方式:beanserializermodifier

如果自定义过滤器的能力是不够的,可配置性最终是修改配置和BeanSerializer实例配置能力。这使得它可以做各种各样的修改(更改订单中的属性被序列化;添加,删除或重命名特性;更换一个自定义序列化程序完全实例等):你可以完全重写或更换普通POJO序列化(“bean”)类型。

这是通过添加一个beanserializermodifier实现:最简单的办法是通过模块接口。使用beanserializermodifier细节更高级的主题;基本的想法是,beanserializermodifier实例定义了回调,Jackson beanserializerfactory在构造序列化时,调用序列化程序。http://wiki.fasterxml.com/JacksonFeatureModules

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36501591/article/details/112931962

智能推荐

测试linux 图形界面,Linux远程图形界面-程序员宅基地

文章浏览阅读399次。1:xmanager passive首先本机开启xmanager passive功能secureCRT开启转发X11数据包功能。主机执行 export DISPLAY=ip.0:0 xhost +执行xclock测试是否显示时钟界面此使用了Xclient和Xserver功能,其中本地使用了xmanager的server功能此用法并不需要服务器安装有图形化界面,kde等,2:vncserver本地安..._测试linux能否打开图形化

IDEA快捷键壁纸_java快捷键壁纸-程序员宅基地

文章浏览阅读4.7k次,点赞7次,收藏3次。IDEA快捷键桌面壁纸不知道有没有刚开始学JAVA的小伙伴跟我一样,对快捷键老是记不住,向大家分享一张我的桌面壁纸,快捷键总结不全,多多指正,让我们一起沦陷于JAVA吧。_java快捷键壁纸

jmeter插件介绍及文件_jmeter 没有stepping threa d group插件怎么解决-程序员宅基地

文章浏览阅读399次。一、jp@gc - Stepping Thread Group (deprecated) 初次安装Jmeter,是看不到jp@gc - Stepping Thread Group (deprecated)和jp@gc - Ultimate Thread Group的,因为这两个线程组是Jmeter Plugins提供的。 安装步骤 打开Jmeter,菜单..._jmeter 没有stepping threa d group插件怎么解决

GStreamer初步_gst audioconverter-程序员宅基地

文章浏览阅读599次。学习《GStreamer开发手册》helloworld.c的代码_gst audioconverter

用ajax实现登录数据库数据验证_登录页面怎么使用ajax对数据库进行验证-程序员宅基地

文章浏览阅读4.7k次。1、数据库数据截图2、登录界面3、登录失败停留在登录界面4、登录成功进入主界面核心代码:Views.pyfrom django.shortcuts import render# Create your views here.from django.http import HttpResponse,JsonResponse,HttpResponseRe..._登录页面怎么使用ajax对数据库进行验证

树和二叉树的概念以及结构-程序员宅基地

树和二叉树是数据结构中常见的概念,它们分别有自己的结构和特点。树可以用来表示具有层次关系的数据,而二叉树则是一种特殊的树结构,每个节点最多有两个子节点。树和二叉树在实际应用中有广泛的应用。

随便推点

PHP和java通讯 WebService+JavaBridge_php与java用http通讯-程序员宅基地

文章浏览阅读856次。最近弄ecshop网上商城这个系统,需要提供对银联快捷支付支持,我查了下资料,发现php调用java,可以通过PHP/Java Bridge来实现这个功能。于是采用PHP/Java Bridge来调用java实现银联支付Demo. 一般来说,PHP和java通讯通讯,使用JavaBridge就可以了,坑爹的是银联那边提供的demo打包成jar包不能正常运行(打包完后运行需要3-5分_php与java用http通讯

玉米社:竞价推广账户展现低+点击率低+跳出率高+询盘少怎么办?优化思路_玉米社 ocpc-程序员宅基地

文章浏览阅读106次。A:“我们目前存在的问题是展现低+点击率低+跳出率高+询盘少,应该怎么办?”B:您发一下平常一天以及一个月的账户展现、点击、点击率等基础数据B:另外,账户关键词有多少个?_玉米社 ocpc

洛夫克拉夫特与文学中的超自然恐怖:早期哥特小说-程序员宅基地

文章浏览阅读801次,点赞24次,收藏15次。本文章分次介绍文学中的超自然恐怖的不同章节,并对相关节点书籍添加详细的注释,补充更多恐怖小说发展的细节。

导出手机缓存的B站视频或者在PC电脑端下载B站视频到本地_手机b站离线视频怎么传到电脑里-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏8次。文章目录1、问题介绍2、将手机中缓存的 B 站视频导入电脑或者其他地方3、在 B 站官网下载喜欢的视频到PC电脑端本地1、问题介绍一般,我们是直接在 B 站在线看视频,或者缓存在手机中看,后者在网页看 B站视频,但是有时候需要将手机缓存的 B 站视频导入电脑或者导出去其它地方,这个时候就需要通过办法实现。2、将手机中缓存的 B 站视频导入电脑或者其他地方其实就是要找到视频在手机的存储位置,根据位置的存储路径用数据线导入电脑就行。这里可以自己设置 B 站缓存视频的存储位置,一般,默认存储在手机的_手机b站离线视频怎么传到电脑里

vs开发vue,无法热更新_vscode vue3项目编写完毕不会更新-程序员宅基地

文章浏览阅读1.3w次。Visual Studio Code开发vue,用npm run dev跑本地服务,修改代码之后在浏览器刷新没反应,需要重新跑一遍代码才会更新,这是怎么回事呢?我遇到的情况是没有自动保存,自己手动保存代码会发现浏览器自动更新了。只需要讲vs改为自动保存即可,如下图:..._vscode vue3项目编写完毕不会更新

有向无环图的最小路径点覆盖_有向无环图最小路径覆盖 例题-程序员宅基地

文章浏览阅读614次。不可相交 ~~~~ 给定一个DAGDAGDAG,要求用尽量少的不相交的简单路径,覆盖DAGDAGDAG的所有顶点(每个顶点恰好被覆盖一次)。设原来的有向无环图为G=(V,E),n=∣V∣G=(V,E),n=|V|G=(V,E),n=∣V∣。把GGG中的每一个点拆成入点和出点,建立一张新的二分图,111..._有向无环图最小路径覆盖 例题

推荐文章

热门文章

相关标签