@JsonAlias和@JSONField序列化和反序列化
@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
。
原文地址:https://blog.csdn.net/huaieli1/article/details/142814462
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!