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

Spring Boot如何自定义接口响应JSON的属性返回顺序

Spring Boot JSON序列化调整父子类字段顺序方法

Spring Boot默认使用Jackson完成JSON序列化,默认逻辑会按类继承层级从上到下收集字段,优先序列化父类定义的属性,因此会出现基类createdAt、updatedAt字段排在响应最前方的情况,可通过以下两种方案调整为期望的顺序:

方案1:子类添加@JsonPropertyOrder注解显式指定顺序(优先推荐)

该方案无需修改基类代码、无需调整全局配置,仅在需要调整顺序的子类上添加Jackson原生注解,显式声明字段排列顺序即可,适合单实体定制顺序的场景。
User类配置示例:

import com.fasterxml.jackson.annotation.JsonPropertyOrder;

// 按期望返回顺序罗列字段,父类属性放在列表最后即可
@JsonPropertyOrder({"id", "email", "firstName", "lastName", "createdAt", "updatedAt"})
public class User extends BaseModel {
    private Long id;
    private String email;
    private String firstName;
    private String lastName;

    // 省略getter、setter、构造方法
}

配置后序列化输出将完全匹配预期结构:子类自身的id、邮箱、姓名字段在前,父类的两个时间字段排在末尾。

方案2:全局配置Jackson序列化规则(适合多实体统一规则场景)

如果项目中存在大量继承同一基类的实体,所有实体都需要遵循「子类属性优先、父类公共属性靠后」的规则,可通过全局配置统一调整,无需在每个子类上重复添加注解。
在Spring Boot配置类中添加如下自定义配置即可:

import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

@Configuration
public class JacksonConfig {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonFieldOrderCustomizer() {
        return builder -> builder.postConfigurer(objectMapper -> {
            objectMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
                @Override
                public List<BeanPropertyDefinition> findSerializationPropertyOrder(
                        com.fasterxml.jackson.databind.introspect.AnnotatedClass annotatedClass) {
                    List<BeanPropertyDefinition> properties = super.findSerializationPropertyOrder(annotatedClass);
                    if (properties == null) {
                        properties = new ArrayList<>();
                    }
                    // 按字段所属类排序:当前子类定义的字段排前面,父类继承的字段排后面
                    properties.sort(Comparator.comparingInt(prop -> 
                            prop.getField().getDeclaringClass() == annotatedClass.getRawClass() ? 0 : 1
                    ));
                    return properties;
                }
            });
        });
    }
}

注意:如果对接口返回字段顺序有强一致性要求,优先选择方案1显式指定顺序,避免默认规则变动、全局配置调整导致字段顺序不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:24:22