首页 > 解决方案 > spring-boot用jackson改变json响应结构

问题描述

我正在使用 Spring Boot REST,并且我想在序列化期间更改 JSON 响应的结构。
我有以下模型:
Title.java

@Entity
public class Title {
    private Short id;
    private String name;
    private Collection<TitleCelebrity> titleCelebrities;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Short getId() {
        return id;
    }

    public void setId(Short id) {
        this.id = id;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(mappedBy = "title")
    public Collection<TitleCelebrity> getTitleCelebrities() {
        return titleCelebrities;
    }

    public void setTitleCelebrities(Collection<TitleCelebrity> titleCelebrities) {
        this.titleCelebrities = titleCelebrities;
    }
}

TitleCelebrity.java

@Entity
@Table(name = "title_celebrity")
public class TitleCelebrity {
    private TitleCelebrityPK id;
    private String characterName;
    private Title title;
    private TitleCelebrityType titleCelebrityType;

    @EmbeddedId
    @JsonIgnore
    public TitleCelebrityPK getId() {
        return id;
    }

    public void setId(TitleCelebrityPK id) {
        this.id = id;
    }

    @Basic
    @Column(name = "character_name")
    public String getCharacterName() {
        return characterName;
    }

    public void setCharacterName(String characterName) {
        this.characterName = characterName;
    }

    @MapsId("titleByTitleId")
    @ManyToOne
    @JoinColumn(name = "title_id", referencedColumnName = "id", nullable = false)
    @JsonIgnore
    public Title getTitle() {
        return title;
    }

    public void setTitle(Title title) {
        this.title = title;
    }

    @MapsId("titleCelebrityTypeByTitleCelebrityTypeId")
    @ManyToOne
    @JoinColumn(name = "title_celebrity_type_id", referencedColumnName = "id", nullable = false)
    public TitleCelebrityType getTitleCelebrityType() {
        return titleCelebrityType;
    }

    public void setTitleCelebrityType(TitleCelebrityType titleCelebrityType) {
        this.titleCelebrityType = titleCelebrityType;
    }
}  

标题CelebrityType.java

@Entity
@Immutable
@Table(name = "title_celebrity_type")
public class TitleCelebrityType {
    private Short id;
    private String name;
    private Collection<TitleCelebrity> titleCelebrities;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Short getId() {
        return id;
    }

    public void setId(Short id) {
        this.id = id;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(mappedBy = "titleCelebrityType")
    @JsonIgnore
    public Collection<TitleCelebrity> getTitleCelebrities() {
        return titleCelebrities;
    }

    public void setTitleCelebrities(Collection<TitleCelebrity> titleCelebrities) {
        this.titleCelebrities = titleCelebrities;
    }
}

因此,当我请求获取 Title 时,JSON 响应如下所示:

{
    "id": 1,
    "name": "Vertigo",
    "titleCelebrities": [
            {
                "characterName": "John 'Scot",
                "titleCelebrityType": {
                    "id": 1,
                    "name": "Cast"
                }
            },
            {
                "characterName": "Madeleine ",
                "titleCelebrityType": {
                    "id": 1,
                    "name": "Cast"
                }
            },
            {
                "characterName": "a",
                "titleCelebrityType": {
                    "id": 2,
                    "name": "Director"
                }
            },
            {
                "characterName": "b",
                "titleCelebrityType": {
                    "id": 3,
                    "name": "Writer"
                }
            },
            {
                "characterName": "c",
                "titleCelebrityType": {
                    "id": 3,
                    "name": "Writer"
                }
            }
        ]
}

无论如何不改变 POJO 类(模型)使其看起来像这样?

{
    "id": 1,
    "name": "Vertigo",
    "titleCelebrities": [
        {
            "cast": {
                "characterName": "John 'Scot",
                "characterName": "Madeleine ",
            },
            "director": {
                "characterName": "a",
            },
            "writer": {
                "characterName": "b",
                "characterName": "c",
            }
        },
    ]
}

标签: javaspringspring-bootjacksonspring-data

解决方案


您可以使用DTO

将数据封装在可以通过网络传输的值对象中:数据传输对象。详细说明DTO

你也可以使用推土机:

Dozer 是一个 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象。详细介绍 推土机

如何将DozerSpring Boot
Dozer注解映射文档一起使用


推荐阅读