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