【问题标题】:How to ignore Json root name in Spring Boot?如何在 Spring Boot 中忽略 Json 根名称?
【发布时间】:2022-01-12 08:43:44
【问题描述】:

我有一个关于 Spring Boot 中 Json 序列化/反序列化的问题。

我有一个实体类,里面嵌入了id:

@Entity
@Table(name="USER_TABLE")
@Getter
@Setter
public class User {

   private UserPK id;
   private String name;

}

/* Getters and Setters excluded */
public class UserPK implements Serializable {
    private Long userId;
    private Long personalId;
}

现在,如果我序列化一个对象,Spring Boot 会在 JSON 中放置一个根“id”标签。能不能排除这个,放到name属性的同级?

实际结果:

{
    "id":{"userId":321, "personalId":222},
    "name":"John Doe"
}

预期结果:

{
    "userId":321,
    "personalId":222,
    "name":"John Doe"
}

提前谢谢你!

【问题讨论】:

  • “如何忽略”的问题有点误导,因为您只想将字符串作为键而不是对象。通常,您正在寻找的是通过使用数据传输对象来完成的,这些对象使用通常在结构上不同的特殊表示在层之间传输数据(就像您想要的那样)。创建一个特殊的 DTO,比如 UserDto,定义其结构,在控制器中将 User 转换为 UserDto(手动,使用 MapStruct 等)并将 DTO 放入响应实体中。
  • 如果您使用 Jackson 来序列化/反序列化,您正在寻找的是 \@JsonUnwrapped 注释
  • 感谢您的回答!它奏效了。

标签: java json spring-boot


【解决方案1】:

您可以使用@JsonUnwrapped 注释来注释User.id 字段,以有效地扁平化底层结构,如下所示:

public class User {
    @JsonUnwrapped
    private UserPK id;
    private String name;
}

请参阅docs

【讨论】:

  • 谢谢,这正是我想要的。
猜你喜欢
  • 2016-08-13
  • 2018-02-25
  • 2014-11-25
  • 2016-08-01
  • 2015-12-28
  • 2021-06-22
  • 2014-10-06
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多