SerializationFeature

最近有个功能需要对Jackson做很多的个性化配置,在网上找了一圈,大部分只对配置项做了说明,无法直接看到效果。
因此,自己根据源码上的注解,对一些常见的配置做了一下测试。
如有理解错误的地方,欢迎指正、探讨,不喜勿喷,谢谢。

SerializationFeature用于开启/禁用Java Bean序列化成JSON有关的特性/功能。

通用输出功能

WRAP_ROOT_VALUE:将JSON包含在一个根节点下。默认禁用。
在这里插入图片描述

INDENT_OUTPUT:美化输出,缩进格式输出JSON。默认禁用。
在这里插入图片描述

错误处理功能

FAIL_ON_EMPTY_BEANS:序列化空Bean时失败。默认启用。如果禁用,则会将对象序列化为空。一般选择禁用

空Bean即没有任何属性的Bean,或者有属性但是没有对应的get方法

在这里插入图片描述
在这里插入图片描述

禁用之后,可以正常序列化:
在这里插入图片描述

FAIL_ON_SELF_REFERENCES:自我引用(自身循环引用)时,序列化失败。默认启用。这种场景下如果想正常序列化,可以与 WRITE_SELF_REFERENCES_AS_NULL 结合使用。
在这里插入图片描述

WRITE_SELF_REFERENCES_AS_NULL:自我引用时,序列化为null(即忽略该属性)。默认禁用。启用该功能的前提是禁用 FAIL_ON_SELF_REFERENCES
在这里插入图片描述

WRAP_EXCEPTIONS:包装异常,在序列化对象时如果出现异常,会捕获异常,进行包装后再抛出,以提供更详细的错误信息。默认启用。
在这里插入图片描述

禁用时的异常信息:
在这里插入图片描述

FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS:序列化时,如果已要求JSON中包含对象的类型信息,但是又有@JsonUnwrapped注解,则序列化失败。默认启用。

序列化时将类型信息写入JSON,可以用于增强反序列化的安全性,通过指定的白名单,仅允许指定的类型才能反序列化成功。

如下所示,由于没有配置org.example.白名单,反序列化失败了:
在这里插入图片描述

在类上使用@JsonTypeInfo注解,也可以在序列化的JSON中包含对象的类型信息。
在这里插入图片描述

@JsonUnwrapped注解可以让对象平铺(去掉了JSON中的层级关系)。
在这里插入图片描述

当序列化时要求带上类型,但是又有@JsonUnwrapped注解时,默认会序列化失败,因为无法序列化Person的类型信息。
在这里插入图片描述

@JsonTypeInfo也一样有问题
在这里插入图片描述

FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS设置为禁用,即可序列化成功,但是不会序列化对应的类型信息。
在这里插入图片描述
在这里插入图片描述

控制被序列化对象的生命周期

CLOSE_CLOSEABLE:对象实现了Closeable接口,序列化后自动调用close()方法。默认禁用(不调用close()方法)。

例如MyBatis分页查询插件PageHelper中的Page对象。

在这里插入图片描述

FLUSH_AFTER_WRITE_VALUEObjectMapper有一组重载的writeValue()方法,如下图所示。看源码的注释,好像是当调用下图中标记的writeVlaue()方法完成之后,调用参数JsonGenerator对象的flush()方法。默认启用。
在这里插入图片描述

特定数据类型的配置

日期类型

WRITE_DATES_AS_TIMESTAMPS:日期类型序列化成时间戳。默认启用。如果禁用默认使用StdDateFormat(yyyy-MM-dd'T'HH:mm:ss.SSSX)格式化日期。

如果日期是Mapkey,则不受此功能的影响,应该使用WRITE_DATE_KEYS_AS_TIMESTAMPS进行控制。

可以设置全局的DateFormat或者在属性上使用@JsonFormat指定想要的格式。如果是JDK8中的日期类型,设置全局的DateFormat无用,需要注册对应的序列化和反序列化器。

在这里插入图片描述
在这里插入图片描述

WRITE_DATE_KEYS_AS_TIMESTAMPSMap日期类型的key序列化为时间戳。默认禁用,使用StdDateFormat(yyyy-MM-dd'T'HH:mm:ss.SSSX)格式化日期。

设置全局的日期格式,对Map日期类型的key同样生效。

在这里插入图片描述

WRITE_DATES_WITH_ZONE_ID:序列化日期上的时区ID。默认禁用。启用时,日期的后面会带上时区ID,这种日期反序列化可能会有问题。
在这里插入图片描述

WRITE_DATES_WITH_CONTEXT_TIME_ZONE:使用ObjectMapper上下文中的时区序列化日期,对没有时区信息的日期类型无效。默认启用。禁用则使用默认的时区进行序列化日期。
在这里插入图片描述

WRITE_DURATIONS_AS_TIMESTAMPSDuration类型的对象序列化为时间戳。默认启用。
在这里插入图片描述

WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS:将日期类型序列化为时间戳时,是否带纳秒。启用:带纳秒,禁用:不带纳秒。默认启用。

只对JDK8中的日期类型有效,对旧的Date无效。
注意:此功能与反序列化READ_DATE_TIMESTAMPS_AS_NANOSECONDS的功能对应。

在这里插入图片描述

枚举

WRITE_ENUMS_USING_TO_STRING:枚举值的序列化方式。启用时,使用Enum.toString()的返回值;禁用时,使用Enum.name()的返回值。默认禁用。

如果没有重写Enum.toString()方法,则Enum.toString()方法的返回值与Enum.name()相同。
注意:此功能通常与反序列化READ_ENUMS_USING_TO_STRING功能的值相同。

在这里插入图片描述

WRITE_ENUMS_USING_INDEX:枚举值的序列化方式。启用时,枚举序列化为数字(序号,从0开始),使用Enum.ordinal()的返回值。禁用时,枚举序列化为文本。默认禁用。

注意:此功能的优先级高于WRITE_ENUMS_USING_TO_STRING,只有将此功能设置为false时才会考虑WRITE_ENUMS_USING_TO_STRING
注意:枚举作为Mapkey时,不受此功能的影响,应该使用WRITE_ENUM_KEYS_USING_INDEX

在这里插入图片描述

WRITE_ENUM_KEYS_USING_INDEX:枚举值的序列化方式。枚举作为Mapkey时,序列化为数字(序号)。默认禁用。

注意:此功能的优先级低于 WRITE_ENUMS_USING_TO_STRING

在这里插入图片描述

数组、集合、Map

WRITE_CHAR_ARRAYS_AS_JSON_ARRAYSchar数组的序列化方式。启用时,将char数组序列化为数组,元素是单字符的字符串。禁用时,将char数组序列化为字符串。默认禁用。
在这里插入图片描述

WRITE_NULL_MAP_VALUESMapnull值的序列化方式。启用时,序列化null值;禁用时,不序列化null值。默认启用。

从2.9版本开始废弃,建议使用JsonInclude.Include.NON_NULL过滤null。

在这里插入图片描述

WRITE_EMPTY_JSON_ARRAYS空集合空数组的序列化方式。启用时,序列化为空数组;禁用时,不序列化。默认启用。对Map无效。

从2.8版本开始废弃,建议使用JsonInclude.Include.NON_EMPTY过滤空集合、空数组。

在这里插入图片描述

WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED:只有单个元素的集合、数组的序列化方式。启用时,正常序列化为数组;禁用时,不序列化为数组(去掉了层级)。默认禁用。

注意:此功能与反序列化ACCEPT_SINGLE_VALUE_AS_ARRAY的功能对应。

在这里插入图片描述

ORDER_MAP_ENTRIES_BY_KEYS:序列化Map按Key进行排序。启用:排序;禁用:不排序。默认禁用。
在这里插入图片描述

其他类型

WRITE_BIGDECIMAL_AS_PLAINBigDecimal的序列化方式。启用时,使用BigDecimal.toPlainString()的返回值;禁用时,使用BigDecimal.toString()的返回值,可能出现科学计数法。默认禁用。

从2.5版本开始废弃,建议使用JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN

BigDecimal有三个toString()方法:
toEngineeringString:有必要时使用工程计数法。工程记数法与科学技术法类似,但要求10的幂必须是3的倍数;
toPlainString:不使用任何指数;
toString:有必要时使用科学计数法。

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值