Jackson序列化Bean额外属性附加--@JsonAnyGetter、@JsonUnwrapped用户

1. 场景

有一项工作,需要将数据从一个服务S中读取出来(得到的是一个JSON),将数据解析转换以后构造成一个数组的类型A的对象,写入到一个服务T中。

  • A.class
@Data
public class A
{
  String f0 ;
  String f1 ;
}

在发现需要增加一种类型A的字类型B,这个类型属性非常多(将近一百),在这种情形下,如果直接定义出类型B来,定义那么多属性,还得设置,将会有更大的工作量,所以考虑是不是这些额外的信息可以用一个Map来存储。变成如下结构:

  • A.class
@Data
public class A
{
  String f0 ;
  String f1 ;
  Map<String , Object> otherPropMap ;
}

输出的JSON:

{
  "f0":"" ,
  "f1":"" ,
  "op1":"" ,
  "op2":"" ,
}

2. 做法

@Data
public class A
{
  String f0 ;
  String f1 ;
  Map<String , Object> otherPropMap ;
  
  @JsonAnyGetter
  public Map<String , String> getOtherPropMap()
  {
    return otherPropMap ;
  }
}

在jackson-annotations-2.11时,@JsonAnyGetter注解只能用在Method上,在2.13版本中,已经可以直接使用在属性上了。

3. JsonUnwrapped用法

@JsonUnwrapped注解,只对Bean其作用,Map是不能起作用的。例如下面是可以的。

@Data
public class A
{
  String f0 ;
  
  @JsonUnwrapped
  B f1 ;
}

// B.java
public class B
{
	String f3 ;
	String f4 ;
}

那么输出结果是:

{
  "f0":"" ,
  "f3":"" ,
  "f4":""
}

你可能感兴趣的:(大数据平台开发技术,开发语言,java,json)