@com.fasterxml.jackson.annotation.JsonAlias("expressCode")
@com.alibaba.fastjson.annotation.JSONField(name = "expressCode")
这两个注解分别属于不同的JSON序列化框架:Jackson 和 Fastjson,它们的用途是处理JSON字段的名称映射,在序列化和反序列化过程中,帮助将不同命名风格的字段映射到Java对象的属性上。
1. @JsonAlias
(Jackson)
@JsonAlias
是 Jackson 序列化框架中的注解,用于指定一个属性在反序列化时可以接受多个不同的JSON字段名。这在处理可能来自不同数据源的JSON时很有用,这些数据源可能使用不同的字段名称来表示同一个含义。
用途:
- 当JSON数据的字段名不一致时,
@JsonAlias
可以指定多个字段名映射到同一个Java属性。 - 在反序列化时,Jackson会尝试匹配这些别名之一来填充对象属性。
举例说明:
假设一个Java对象有一个属性 expressCode
,但不同的API返回的JSON数据中,这个字段可能被命名为 express_code
或 shippingCode
。使用 @JsonAlias
,可以允许 Jackson 在反序列化时识别这多个字段名。
import com.fasterxml.jackson.annotation.JsonAlias;public class Order {@JsonAlias({"express_code", "shippingCode"})private String expressCode;// getter and setter
}
当我们接收到如下JSON时,Jackson会将 express_code
或 shippingCode
的值映射到 expressCode
:
{"express_code": "EXP123456"
}
或
{"shippingCode": "EXP123456"
}
都会成功地映射到 Order
对象的 expressCode
字段。
2. @JSONField
(Fastjson)
@JSONField
是 Fastjson 序列化框架中的注解,用于指定JSON序列化和反序列化时的字段名。这相当于为Java类中的字段自定义序列化时使用的JSON key 名称,或者处理JSON的反序列化。
用途:
- 可以用来指定JSON字段和Java字段之间的映射关系,尤其在序列化和反序列化过程中,JSON中的字段名和Java字段名不一致时很有用。
- 在序列化时,Java字段的名字会转换成
@JSONField
注解中指定的字段名。 - 在反序列化时,Fastjson会根据指定的字段名从JSON中提取对应的数据。
举例说明:
假设同样的类 Order
,但这次我们使用 Fastjson 来处理,假设我们想在序列化时将 expressCode
输出为 express_code
,我们可以使用 @JSONField
来指定这个名称:
import com.alibaba.fastjson.annotation.JSONField;public class Order {@JSONField(name = "express_code")private String expressCode;// getter and setter
}
示例:
当我们将对象序列化为JSON时,它会输出如下结果:
{"express_code": "EXP123456"
}
而在反序列化时,@JSONField(name = "express_code")
也允许 Fastjson 将JSON中的 express_code
字段映射到 expressCode
属性。
综合对比:
@JsonAlias
(Jackson) 主要是用来处理 反序列化 时字段名的别名,可以映射多个别名到同一个属性上。@JSONField
(Fastjson) 用来指定 序列化 和 反序列化 时的字段名,当Java字段与JSON字段名不同步时使用。
一起使用的场景:
两者一起使用时,可以确保代码兼容使用 Jackson 和 Fastjson 两种不同的JSON处理库,能够处理不同格式的JSON输入和输出。
例如:
import com.fasterxml.jackson.annotation.JsonAlias;
import com.alibaba.fastjson.annotation.JSONField;public class Order {@JsonAlias({"express_code", "shippingCode"})@JSONField(name = "express_code")private String expressCode;// getter and setter
}
此时,Jackson在反序列化时可以识别 express_code
和 shippingCode
,而 Fastjson 在序列化时会输出 express_code
。