@JsonAlias
注解是 Jackson 提供的一个功能强大的注解,允许一个字段在反序列化时匹配多个 JSON 属性名。它适用于在处理多种输入数据格式时,或当 JSON 数据的键名可能变化时。
一、@JsonAlias
的作用
- 多种别名:
@JsonAlias
允许你为一个字段定义多个可能的 JSON 键名,这在 JSON 数据的键名有多种可能时非常有用。 - 反序列化:在反序列化时,如果 JSON 中的键名与
@JsonAlias
中定义的别名之一匹配,Jackson
就会把这个键的值赋给对应的字段。 @JsonAlias
的作用除了上述两个之外,也同@JsonProperty
,详情参考—> 【注解】@JsonProperty 详解
二、示例:使用 @JsonAlias
来处理多个键名
真实使用场景—> 数据库存的JSON数据转为Map,key值是中文,转成英文,转为json数据传给前端
假设你有一个 User
类,它的字段可以接收多个不同的 JSON 键名。例如,可能存在 “名称” 或 “名字”,它们都应该映射到 name
字段。
import com.fasterxml.jackson.annotation.JsonAlias;
public class User {
@JsonAlias({"名称", "名字"})
private String name;
@JsonAlias({"年龄", "岁数"})
private int age;
@JsonAlias({"性别", "性"})
private String gender;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
使用示例
假设你接收到的 JSON 数据可能是以下两种形式之一:
{
"名字": "张三",
"岁数": 30,
"性": "男"
}
或者:
{
"名称": "李四",
"年龄": 25,
"性别": "女"
}
@JsonAlias
会处理这两种情况,并将它们都映射到 User 对象中相应的字段上。
控制器中的使用
@RestController
@RequestMapping("/api")
public class UserController {
@PostMapping("/user")
public User createUser(@RequestBody User user) {
// 此时 user 对象已经根据别名进行了正确的映射
return user; // 可以返回给前端,或者进行其他业务处理
}
}
前端处理
无论前端发送的是 “名字” 还是 “名称”,后端都可以正确处理并将其映射到 name 字段上。
@JsonAlias
在反序列化中处理多个别名:适用于处理不同 JSON 格式或处理 JSON 键名变化的场景。
便捷性:通过 @JsonAlias,无需在代码中手动处理不同的键名映射,Jackson 会自动完成这项工作。
增强灵活性:可以更灵活地处理外部输入的数据格式,确保应用程序的兼容性和健壮性。