You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring HATEOAS序列化反序列化_links 使rel值为嵌套JSON键名

Spring HATEOAS links数组转rel为键的嵌套对象方案

最新版Spring HATEOAS默认未启用HAL格式序列化时,会将links集合输出为携带rel字段的数组结构,通过以下两种方式即可调整为需要的以rel为根键的嵌套_links结构。


方案一:全局启用HAL默认配置(推荐)

Spring HATEOAS原生支持HAL格式的链接序列化规则,不需要手写转换逻辑,全局开启后所有接口的links都会自动按目标结构渲染:
如果是Spring Boot项目,直接在配置文件中添加如下配置即可:
application.yml配置:

spring:
  hateoas:
    use-hal-as-default-json-media-type: true

如果是非Spring Boot的原生Spring项目,手动将HalJacksonModule注册到项目使用的JacksonObjectMapper中,同时配置HAL为默认JSON媒体类型即可,该模块会自动完成links数组到键值对结构的转换,自动把每个链接的rel值作为外层对象的键,不会冗余输出rel字段。

方案二:自定义序列化器适配特殊场景

如果项目无法全局启用HAL格式,需要单独处理嵌套对象内的links数组,可以通过Jackson自定义序列化器实现结构转换:

  1. 在存储links集合的字段上添加自定义序列化注解:
// 对应业务中enrollments数组的元素类
public class Enrollment {
    private String id;
    private OffsetDateTime end_timestamp;
    // 如果links是自定义POJO就替换成实际类名
    @JsonSerialize(using = RelKeyLinkSerializer.class)
    @JsonProperty("_links") // 直接指定序列化后的字段名为_links
    private List<LinkItem> links;
    // 其余字段、构造方法、getter/setter省略
}
  1. 实现自定义序列化器逻辑,核心是遍历links数组,提取每个元素的rel值作为键:
public class RelKeyLinkSerializer extends StdSerializer<List<LinkItem>> {
    protected RelKeyLinkSerializer() {
        super(List.class, false);
    }

    @Override
    public void serialize(List<LinkItem> linkList, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        for (LinkItem link : linkList) {
            // 以rel值为key写入当前链接的属性
            gen.writeObjectFieldStart(link.getRel());
            gen.writeStringField("id", link.getId());
            gen.writeStringField("href", link.getHref());
            gen.writeEndObject();
        }
        gen.writeEndObject();
    }
}

// 对应当前links数组里的元素结构,可根据实际业务字段调整
class LinkItem {
    private String rel;
    private String id;
    private String href;
    // getter/setter省略
}

配置完成后序列化输出的结构就和给出的期望效果完全一致,不需要额外做其他字段映射。


内容的提问来源于stack exchange,提问作者Laxmikant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:24:22