如何让@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
相关产品推荐
相关产品推荐

