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自定义序列化器实现结构转换:
- 在存储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省略 }
- 实现自定义序列化器逻辑,核心是遍历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
相关产品推荐
相关产品推荐

