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

如何让@JsonAnyGetter生成的动态字段置于JSON响应顶部?

让动态生成的JSON字段排在最顶部的几种方法

因为你使用Jackson的@JsonAnyGetter生成动态字段,默认情况下Jackson会将这类动态属性放在固定属性之后,要让它排在最前面,可以采用以下两种方案:

方法1:全局开启动态属性优先序列化

直接修改ObjectMapper的序列化特性,启用WRITE_DYNAMIC_PROPERTIES_FIRST即可让所有动态属性优先输出:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.WRITE_DYNAMIC_PROPERTIES_FIRST);

如果是Spring Boot项目,也可以通过配置文件全局生效,无需修改代码:

application.properties

spring.jackson.serialization.write-dynamic-properties-first=true

application.yml

spring:
  jackson:
    serialization:
      write-dynamic-properties-first: true

方法2:针对单个类自定义序列化器(局部生效)

如果不想全局修改,仅让ResponseBuilder类的动态字段排在最前面,可以自定义序列化器:

public class ResponseBuilderSerializer extends JsonSerializer<ResponseBuilder> {
    @Override
    public void serialize(ResponseBuilder value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        // 先写入动态字段
        gen.writeObjectField(value.getType(), value.getItems());
        // 再写入固定字段
        gen.writeNumberField("itemCount", value.getItemCount());
        gen.writeNumberField("totalItems", value.getTotalItems());
        gen.writeEndObject();
    }
}

接着在ResponseBuilder类上添加注解指定序列化器,同时可以移除原有的@JsonAnyGetter相关代码:

@AllArgsConstructor
@JsonSerialize(using = ResponseBuilderSerializer.class)
public class ResponseBuilder {

    private final String type;

    private final List<?> items;

    @Getter
    private final Integer itemCount;

    @Getter
    private final Long totalItems;

    // 给序列化器提供访问字段的方法
    public String getType() {
        return type;
    }

    public List<?> getItems() {
        return items;
    }
}

这样序列化ResponseBuilder实例时,会优先输出动态字段,再依次输出固定的itemCount和totalItems。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:23:22