需求
前后端分离的开发模式中,后端先定义接口文档,前端再根据接口文档进行开发。这种模式一般情况下运行得挺好,偶尔修改字段名称,前后端也能协调。但是有时候前端和后端传输的字段名称不一致,大家都不想修改,这种情况该怎么办?Jackson 当中有一些解决方案,可以参考一下。
@JsonCreator
我们可以使用 @JsonCreator 注解来调整反序列化中使用的构造函数。当我们需要反序列化一些与我们需要获取的目标实体不完全匹配的 JSON 时,这非常有用。
让我们来看一个例子。 假设我们需要反序列化以下 JSON:
{
"id":1,
"theName":"My bean"
}
但是,我们的目标实体中没有 theName 字段,只有 name 字段。 现在我们不想更改实体本身,我们只需要通过使用 @JsonCreator 注解构造函数,并同时使用 @JsonProperty 注解来对解组过程进行更多控制:
@Data
public class BeanWithCreator {
public int id;
public String name;
@JsonCreator
public BeanWithCreator(
@JsonProperty("id") int id,
@JsonProperty("theName") String name) {
this.id = id;
this.name = name;
}
}
测试:
@Test
public void creator() throws JsonProcessingException {
String json = "{\"id\":1,\"theName\":\"My bean\"}";
BeanWithCreator bean = new ObjectMapper()
.readerFor(BeanWithCreator.class)
.readValue(json);
System.out.println("name: ".concat(bean.getName()));
}
结果:
name: My bean
@JsonAlias
@JsonAlias 这个注解只在反序列化时起作用,指定该 java 对象属性可以接收的别名。
来看一个例子:
@Data
public class AliasBean {
@JsonAlias({"fName", "f_name"})
private String firstName;
private String lastName;
}
这里有一个 POJO,我们想将 fName,f_name 和 firstName 等值反序列化到 POJO 的 firstName 变量中。
以下是确保此注解按预期工作的测试:
@Test
public void alias() throws JsonProcessingException {
String json = "{\"fName\": \"John\", \"lastName\": \"Green\"}";
AliasBean aliasBean = new ObjectMapper().readerFor(AliasBean.class).readValue(json);
System.out.println("firstName: ".concat(aliasBean.getFirstName()));
}
测试结果:
firstName: John