反序列化时对象展开为列表的实用方法及技巧
利用 @JsonValue 注解,Jackson 能够将对象直接“拆解”为内部的列表值,省去一层嵌套,最终生成像 [ [123, 45 6], [789, 12 3] ] 这样的扁平数组。 通常,Jackson 在序列化一个 Java 对象时,默认会将所有字段以键值对形式输出成一个 JSON 对象。
利用 @JsonValue 注解,Jackson 能够将对象直接“拆解”为内部的列表值,省去一层嵌套,最终生成像 [ [123, 45.6], [789, 12.3] ] 这样的扁平数组。
通常,Jackson 在序列化一个 Java 对象时,默认会将所有字段以键值对形式输出成一个 JSON 对象。但在某些场景下,我们并不希望 DataPoint 被包装成 { "dataPoint": [...] } 的结构,而是希望它自身直接等价于内部的二维数值列表——换句话说,每个 DataPoint 实例应当被序列化为一个长度为 2 的数组 [long, double],并作为 dataPoint 数组中的一个元素。
关键在于,解决方案简单得令人惊讶:只需在承载数据的字段(或其 getter 方法)上添加 @JsonValue 注解即可。
public class DataPoint {
private final List
✅ 需要留意的几个细节:
- @JsonValue 仅能标注一个非 void 且泛型非 void 的 public 方法或字段(推荐使用 getter);
- 若同时标注两个,Jackson 会直接抛出错误;
- 该注解只负责序列化(Java → JSON),反序列化(JSON → Java)还需配合 @JsonCreator 或使用默认构造器加 setter。由于代码中的 data 是只读 final 字段,建议补充一个带参数的 @JsonCreator 构造器来支持反序列化;
- List> 在序列化时类型不够明确,推荐使用 List
或更稳妥的 List ——因为 long 和 double 都属于 Number 类型。
下面提供一个完整可运行的示例(已包含反序列化支持):
public class DataPoint {
private final List data;
public DataPoint(long date, double counts) {
this.data = List.of(date, counts);
}
@JsonCreator
public DataPoint(@JsonProperty("data") List data) {
if (data == null || data.size() != 2) {
throw new IllegalArgumentException("DataPoint requires exactly 2 numbers");
}
this.data = data;
}
@JsonValue
public List getData() {
return data;
}
}
配置完成后,Entry 类无需任何修改,Jackson 便能直接输出预期的 JSON 结构:
{
"name": "20070480",
"dataPoint": [
[1681792679186, 1096.0],
[1681792680186, 1147.0]
]
}
总结来说,@JsonValue 是 Jackson 提供的一种轻量级声明机制,专门用于将对象“降维”为简单的 JSON 值(例如数组、字符串或数字)。对于“对象本身即数据元组”的场景特别适用,无需编写自定义序列化器,既保持了简洁性,又提升了可维护性。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Debian下Golang跨平台开发方法指南
在Debian系统上,通过Go原生交叉编译、标准库跨平台抽象及合理代码设计,实现“一次编写,多平台运行”。方法包括环境配置、平台差异处理、交叉编译、依赖管理与多平台测试,最终生成稳定静态可执行文件。
Express服务器JSON请求体正确解析完整实践指南
Express应用中发现`req body`显示为`[Object]`,并非JSON解析失败,而是`console log()`默认对象缩略行为所致。使用`JSON stringify()`或`util inspect()`可完整查看数据结构。正确配置`express json()`中间件并设置请求头,即可确保解析成功。生产环境应避免直接输出敏感数据,建议限
Java泛型构造惯用模式:工厂模式替代反射与冗余参数
Java接口无法声明构造方法,初始化泛型子类型时应使用工厂接口或Supplier函数式接口,避免反射与自引用泛型。工厂模式实现编译期安全、零反射开销、IDE友好,按需选用Supplier或专用工厂接口。
Debian系统Golang并发编程入门教程
在Debian系统通过包管理器安装Golang,介绍并发编程:Goroutines是轻量级线程,用go关键字启动;Channels用于同步通信,两者结合实现高并发服务。
Debian下Golang机器学习库推荐与使用指南
在Debian系统配置Golang环境后,可选用Gorgonia、Gonum和GoLearn等机器学习库。以Gorgonia为例,通过计算图定义线性回归模型,利用梯度下降优化均方误差,训练后即可预测新数据。
- 热门数据榜
相关攻略
2026-07-09 06:54
2026-07-09 06:54
2026-07-09 06:54
2026-07-09 06:54
2026-07-09 06:54
2026-07-09 06:53
2026-07-09 06:53
2026-07-09 06:53
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

