参考
Jackson注解
对@JsonUnwrapped的介绍, 简单来说,该注解的作用就是在json序列化与反序列化时,将嵌套对象的属性平铺到一层。
注意
JsonUnwrapped仅支持对普通java对象(POJO)展开,类似Map、Map.Entry是不支持的。
JsonUnwrapped提供三个属性配置
-
enable:是否启用,jackson注解大多有这个属性,就是注解是否生效
-
prefix:展开的属性拼接前缀
-
suffix:展开属性拼接后缀
输出结果
当我们用到多个内嵌对象,内嵌对象存在相同属性名称时,这时候需要配合前缀/后缀来区分展开的属性属于哪个内嵌对象的属性。 但jackson在加前缀或者后缀时,并未对命名策略支持,当然,这个并不影响json本身的序列化与反序列化,非强迫症患者可以忽略以下内容。
@JsonUnwrapped是怎么实现的?
在
PropertyBuilder
和
BeanDeserializerBase
中都使用了来自AnnotationIntrospector的方法
findUnwrappingNameTransformer
。 该方法返回了一个
NameTransformer
,如果为null则表示不进行展开序列化/反序列化,否则按照返回的转换器进行名称转换。 即如何将未展开的属性转换为展开后的属性名称方式以及如何将已展开的属性还原为未展开的属性名称。
我们看看默认的命名转换是怎么定义的。
Jackson的命名风格
Jackson支持默认支持7种命名风格,参考
PropertyNamingStrategies
,命名转换的定义。
所有命名规则都是基于LOWER_CAMEL_CASE进行转换,也就是代码里面的属性必须是驼峰的,否则转换可能不是你想要的结果。
名称
|
描述
|
示例
|
LOWER_CAMEL_CASE
|
首字母小写驼峰
|
numberValue、namingStrategy、theDefiniteProof
|
UPPER_CAMEL_CASE
|
首字母大写驼峰
|
NumberValue、NamingStrategy、TheDefiniteProof
|
SNAKE_CASE
|
小写下划线分隔
|
number_value、naming_strategy、the_definite_proof
|
UPPER_SNAKE_CASE
|
大写下划线分隔
|
NUMBER_VALUE、NAMING_STRATEGY、THE_DEFINITE_PROOF
|
LOWER_CASE
|
全小写
|
numbervalue、namingstrategy、thedefiniteproof
|
KEBAB_CASE
|
小写中线分隔
|
number-value、naming-strategy、the-definite-proof
|
LOWER_DOT_CASE
|
小写点分隔
|
number.value、naming.strategy、the.definite.proof
|
自定义JsonUnwrapped命名实现
基于Jackson本身的属性命名策略实现,做自定义增强JsonUnwrapped注解,自定义AnnotationIntrospector重写 findUnwrappingNameTransformer方法,在定义ObjectMapper时设置我们自定义的AnnotationIntrospector即可。
自定义增强JsonUnwrapped注解
自定义AnnotationIntrospector
ObjectMapper初始化配置
效果展示
LOWER_CAMEL_CASE(默认)
输出结果
LOWER_DOT_CASE