目录
- 一、问题定位
- 二、框架对比表
- 三、典型错误场景
- 四、解决方案
- ✅ 方案一:使用 FastJSON 原生注解
- ✅ 方案二:统一使用 Jackson 框架
- 五、Maven 依赖建议
- 六、关键总结
一、问题定位
com.alibaba.fastjson.JSON.parseObject()
方法无法识别 Jackson 的 @JsonProperty
注解,导致字段映射失败。
核心矛盾:FastJSON 无法识别 Jackson 的 @JsonProperty 注解
二、框架对比表
特性 | FastJSON | Jackson |
---|---|---|
字段映射注解 | @JSONField(name = "xxx") |
@JsonProperty("xxx") |
反序列化方法 | JSON.parseObject(json, Class) |
ObjectMapper.readValue(json, Class) |
是否支持 Jackson 注解 | ❌ 不支持 | ✅ 支持 |
是否支持 FastJSON 注解 | ✅ 支持 | ❌ 不支持 |
三、典型错误场景
// 使用 Jackson 注解的类
public class User {@JsonProperty("user_name") // FastJSON 会忽略该注解private String name;
}// FastJSON 反序列化失败
String json = "{\"user_name\": \"Alice\"}";
User user = JSON.parseObject(json, User.class); // name 字段为 null
四、解决方案
✅ 方案一:使用 FastJSON 原生注解
适用场景:项目以 FastJSON 为主
public class User {@JSONField(name = "user_name")private String name;
}// 正确反序列化
User user = JSON.parseObject("{\"user_name\": \"Alice\"}", User.class);
✅ 方案二:统一使用 Jackson 框架
适用场景:项目需兼容 Jackson 注解
import com.fasterxml.jackson.databind.ObjectMapper;
public class User {@JsonProperty("user_name") // FastJSON 会忽略该注解private String name;
}
String json = "{\"user_name\": \"Alice\"}";
ObjectMapper mapper = new ObjectMapper();
// 关键配置:禁用未知字段校验
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
User user = mapper.readValue(json, User.class); // 自动识别 @JsonProperty
五、Maven 依赖建议
<!-- fastjson 依赖(方案一需要) -->
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.42</version>
</dependency>
<!-- Jackson 依赖(方案二需要) -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.16.1</version>
</dependency>
六、关键总结
- 注解专属性:FastJSON 仅识别
@JSONField
,Jackson 仅识别@JsonProperty
。 - 框架隔离原则:避免在同一个类中混用两种注解,易引发不可预期的行为。