需求

前后端分离的开发模式中,后端先定义接口文档,前端再根据接口文档进行开发。这种模式一般情况下运行得挺好,偶尔修改字段名称,前后端也能协调。但是有时候前端和后端传输的字段名称不一致,大家都不想修改,这种情况该怎么办?Jackson 当中有一些解决方案,可以参考一下。

@JsonCreator

我们可以使用 @JsonCreator 注解来调整反序列化中使用的构造函数。当我们需要反序列化一些与我们需要获取的目标实体不完全匹配的 JSON 时,这非常有用。
让我们来看一个例子。 假设我们需要反序列化以下 JSON:

  1. {
  2. "id":1,
  3. "theName":"My bean"
  4. }

但是,我们的目标实体中没有 theName 字段,只有 name 字段。 现在我们不想更改实体本身,我们只需要通过使用 @JsonCreator 注解构造函数,并同时使用 @JsonProperty 注解来对解组过程进行更多控制:

  1. @Data
  2. public class BeanWithCreator {
  3. public int id;
  4. public String name;
  5. @JsonCreator
  6. public BeanWithCreator(
  7. @JsonProperty("id") int id,
  8. @JsonProperty("theName") String name) {
  9. this.id = id;
  10. this.name = name;
  11. }
  12. }

测试:

  1. @Test
  2. public void creator() throws JsonProcessingException {
  3. String json = "{\"id\":1,\"theName\":\"My bean\"}";
  4. BeanWithCreator bean = new ObjectMapper()
  5. .readerFor(BeanWithCreator.class)
  6. .readValue(json);
  7. System.out.println("name: ".concat(bean.getName()));
  8. }

结果:

  1. name: My bean

@JsonAlias

@JsonAlias 这个注解只在反序列化时起作用,指定该 java 对象属性可以接收的别名。
来看一个例子:

  1. @Data
  2. public class AliasBean {
  3. @JsonAlias({"fName", "f_name"})
  4. private String firstName;
  5. private String lastName;
  6. }

这里有一个 POJO,我们想将 fName,f_name 和 firstName 等值反序列化到 POJO 的 firstName 变量中。
以下是确保此注解按预期工作的测试:

  1. @Test
  2. public void alias() throws JsonProcessingException {
  3. String json = "{\"fName\": \"John\", \"lastName\": \"Green\"}";
  4. AliasBean aliasBean = new ObjectMapper().readerFor(AliasBean.class).readValue(json);
  5. System.out.println("firstName: ".concat(aliasBean.getFirstName()));
  6. }

测试结果:

  1. firstName: John