java - 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",
}
},
]
}
解决方案
您可以使用DTO:
将数据封装在可以通过网络传输的值对象中:数据传输对象。详细说明DTO
你也可以使用推土机:
Dozer 是一个 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象。详细介绍 推土机
如何将Dozer与 Spring Boot
Dozer注解映射文档一起使用
推荐阅读
- javascript - 按下搜索图标后如何展开搜索栏
- c++ - 向量是否将每个元素复制/移动到内存不足时分配的新内存
- javascript - 单进程 webkit 源代码
- javascript - 承诺代码审查
- html - 从网站中删除 .html 扩展名
- android - 执行 adb-sync 后,文件 * 真的 * 存在于哪里?
- angular - 将属性公开为可观察对象的最简单语法?
- excel - 如何在 Excel 中编写 Countifs 公式?
- ruby-on-rails - Cancancan ActiveAdmin:跳过对 :create 的授权
- swift - 在 Swift 中继承 NSLayoutConstraint