当前位置: 首页 > news >正文

@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

http://www.lryc.cn/news/458006.html

相关文章:

  • k8s1.27部署ingress 1.11.2
  • 【运维】自动化运维详解
  • 线控底盘技术介绍
  • DOM对象
  • [SQL] 数据库图形化安装和使用
  • springboot 前后端处理日志
  • C++11 简单手撕多线程编程
  • 刷c语言练习题7(牛客网)
  • Web Worker和WebSocket
  • 【LeetCode】动态规划—712. 两个字符串的最小ASCII删除和(附完整Python/C++代码)
  • wordpress Contact Form 7插件提交留言时发生错误可能的原因
  • uibot发送邮件:自动化邮件发送教程详解!
  • 【PostgreSQL】PG数据库表“膨胀”粗浅学习
  • 力扣(leetcode)每日一题 871 最低加油次数 | 贪心
  • ppt压缩文件怎么压缩?压缩PPT文件的多种压缩方法
  • 2024.10月11日--- SpringMVC拦截器
  • uniapp 锁屏显示插件 Ba-LockShow(可让vue直接具备锁屏显示能力)
  • CSS计数器
  • 嵌入式Linux:信号集
  • Linux 外设驱动 应用 1 IO口输出
  • 基于SpringBoot+Vue+MySQL的留守儿童爱心网站
  • 调用第三方接口
  • JAVA 多线程入门例子:CountDownLatch
  • k8s jenkins 动态创建slave
  • MVS海康工业相机达不到标称最大帧率
  • 数据结构:用双栈实现一个队列
  • QScroller Class
  • React高阶组件详解
  • TextView把其它控件挤出屏幕的处理办法
  • 长度为 K 的重复字符子串数目