繁体   English   中英

Spring Boot使用杰克逊更改JSON响应结构

[英]Spring-boot change the json response structure with jackson

我正在使用Spring Boot REST,我想在序列化过程中更改JSON响应的结构。
我有以下型号:
标题.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;
    }
}  

TitleCelebrityType.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;
    }
}

因此,当我请求获取标题时,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",
            }
        },
    ]
}

您可以使用DTO

要将数据封装在可以通过网络传输的值对象中,请执行以下操作:数据传输对象。 详细DTO

您也可以使用推土机:

Dozer是Java Bean到Java Bean的映射器,可将数据从一个对象递归复制到另一个对象。 在细节推土机

如何在Spring Boot中使用推土机
推土机注释映射文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM