FastJson方法命名陷阱:从getUserName()报错看JavaBean规范与JSON解析冲突
在Java开发中,FastJson作为阿里巴巴开源的高性能JSON处理库,因其简洁的API和出色的性能被广泛应用于各种项目。然而,许多开发者在实际使用过程中都遇到过类似com.alibaba.fastjson.JSONException: set property error的异常,特别是当类中存在某些特殊命名的方法时。本文将深入分析这类问题的根源,并提供多种解决方案。
1. 问题重现:一个典型的FastJson解析异常
让我们从一个具体的案例开始。假设我们有一个简单的User类:
@Data
public class User {
private String firstName;
private String lastName;
public String getUserName() {
if(StringUtils.isBlank(this.firstName) || StringUtils.isBlank(this.lastName)) {
return "";
}
return this.firstName + " " + this.lastName;
}
}
当我们尝试使用FastJson进行序列化和反序列化时:
public static void main(String[] args) {
User user = new User();
user.setFirstName("XZ");
user.setLastName("BD");
// 序列化再反序列化
User userFromJson = JSON.parseObject(JSON.toJSONString(user), User.class);
System.out.println(userFromJson.getUserName());
}
这段代码会抛出以下异常:
com.alibaba.fastjson.JSONException: set property error, com.xzbd.jdemo.entry.User#userName
2. 问题根源:JavaBean规范与FastJson解析机制的冲突
2.1 JavaBean命名规范的影响
JavaBean规范中,getXxx()和setXxx()方法通常用于访问和修改对象的属性。FastJson在解析JSON时,会遵循这一规范:
- 属性推断机制:FastJson会扫描类中的所有public方法
- 方法名解析:对于以
get开头的方法,FastJson会将其后的部分(首字母小写)视为属性名 - 字段映射:尝试将JSON中的字段与推断出的属性进行匹配
在我们的例子中,getUserName()方法被FastJson解释为存在一个名为userName的属性。
2.2 FastJson的反序列化流程
FastJson的反序列化过程大致如下:
- 解析JSON字符串,构建键值对映射
- 对于每个键,查找目标类中对应的setter方法
- 如果找到setter,调用该方法设置值
- 如果找不到setter但存在字段,直接设置字段值
当FastJson尝试为userName属性设置值时,由于User类中既没有userName字段,也没有setUserName()


3763

被折叠的 条评论
为什么被折叠?



