自学内容网 自学内容网

@JsonAlias和@JSONField序列化和反序列化

@com.fasterxml.jackson.annotation.JsonAlias("expressCode")
@com.alibaba.fastjson.annotation.JSONField(name = "expressCode")

这两个注解分别属于不同的JSON序列化框架:JacksonFastjson,它们的用途是处理JSON字段的名称映射,在序列化和反序列化过程中,帮助将不同命名风格的字段映射到Java对象的属性上。

1. @JsonAlias (Jackson)

@JsonAlias 是 Jackson 序列化框架中的注解,用于指定一个属性在反序列化时可以接受多个不同的JSON字段名。这在处理可能来自不同数据源的JSON时很有用,这些数据源可能使用不同的字段名称来表示同一个含义。

用途:
  • 当JSON数据的字段名不一致时,@JsonAlias可以指定多个字段名映射到同一个Java属性。
  • 在反序列化时,Jackson会尝试匹配这些别名之一来填充对象属性。
举例说明:

假设一个Java对象有一个属性 expressCode,但不同的API返回的JSON数据中,这个字段可能被命名为 express_codeshippingCode。使用 @JsonAlias,可以允许 Jackson 在反序列化时识别这多个字段名。

import com.fasterxml.jackson.annotation.JsonAlias;

public class Order {
    @JsonAlias({"express_code", "shippingCode"})
    private String expressCode;

    // getter and setter
}

当我们接收到如下JSON时,Jackson会将 express_codeshippingCode 的值映射到 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_codeshippingCode,而 Fastjson 在序列化时会输出 express_code


原文地址:https://blog.csdn.net/huaieli1/article/details/142814462

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!