@jsonproperty注解支持五种反序列化字段映射方法:一、指定唯一json键名;二、结合@jsonalias支持多别名;三、在setter方法上标注以适配不可修改字段;四、配合@jsonignoreproperties忽略未知字段;五、通过全局propertynamingstrategy统一命名转换。

当JSON字符串中的字段名与Java对象属性名不一致时,反序列化过程将无法自动完成字段绑定,导致目标字段值为null或抛出UnrecognizedPropertyException异常。以下是针对@JsonProperty注解在反序列化阶段实现字段映射与别名配置的多种可行方法:
一、使用@JsonProperty指定唯一映射名称
该方式适用于JSON字段名固定且与Java字段名完全不同的场景。@JsonProperty(value = "json_key")强制将指定JSON键名绑定到当前Java字段,仅支持单一名字匹配。
1、在目标字段上方添加@JsonProperty注解,并传入期望匹配的JSON字段名。
2、确保JSON字符串中包含该精确键名,例如{"user_name": "Alice"}。
3、调用ObjectMapper.readValue(jsonString, TargetClass.class)执行反序列化。
4、验证字段值是否正确注入,若JSON中使用其他键名(如username)则该字段将保持null。
二、结合@JsonAlias声明多级别名
该方式用于兼容不同数据源下发的异构JSON格式,允许同一Java字段接受多个可选的JSON键名,提升反序列化的容错能力。
1、在字段上同时标注@JsonProperty主名称与@JsonAlias别名数组。
2、示例:@JsonProperty("pwd") @JsonAlias({"pass_word", "password", "pswd"}) private String password;
3、提供任意一种合法键名的JSON输入,如{"pass_word":"123456"}或{"password":"123456"}。
4、ObjectMapper将按顺序尝试匹配@JsonAlias中各名称,首个匹配成功的键名即完成赋值,不继续后续匹配。
三、在getter/setter方法上声明@JsonProperty
该方式适用于无法修改字段定义(如继承自第三方类)但需控制反序列化行为的场景,通过方法级注解接管字段绑定逻辑。
1、移除字段上的@JsonProperty,改在对应的setter方法上添加注解。
2、例如:public void setUserName(@JsonProperty("login_id") String userName) { this.userName = userName; }。
3、确保ObjectMapper配置未禁用setter检测(默认启用)。
4、反序列化时,Jackson会查找匹配JSON键名的setter方法,此时字段本身无需public或存在对应getter。
四、配合@JsonIgnoreProperties忽略未知字段并启用宽松模式
该方式用于处理含冗余字段的JSON输入,避免因额外键名触发反序列化失败,同时保障@JsonProperty映射仍生效。
1、在类级别添加@JsonIgnoreProperties(ignoreUnknown = true)注解。
2、保留各字段上的@JsonProperty或@JsonAlias声明不变。
3、提交包含未声明字段的JSON,例如{"user_name":"Bob","created_at":"2025-01-01","temp_field":"ignored"}。
4、只有被@JsonProperty或@JsonAlias显式声明的字段参与绑定,其余字段被静默丢弃。
五、使用全局PropertyNamingStrategy统一转换规则
该方式适用于项目中大量字段需遵循相同命名约定(如snake_case ↔ camelCase),避免逐字段重复标注注解。
1、配置ObjectMapper实例:mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);。
2、移除所有字段上的@JsonProperty,仅保留原始Java字段名(如userName → user_name)。
3、当JSON字段为下划线风格时,如{"first_name":"John","last_name":"Doe"},自动映射至firstName/lastName字段。
4、若某字段需例外处理,仍可在其上单独加@JsonProperty覆盖全局策略。










