不要在 Spring MVC 3 中使用 Jackson 序列化子类型属性

问题描述 投票:0回答:4

我正在使用 Spring MVC 和这样的控制器:

@RequestMapping(value = "/list", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody List<Service> list() {
return services.list();
}

模型是这样的:

public class Service {
 private User user;
 ...
}

public class User {
 private String name;
 ...
}

public class ExtendedUser extends User {
 private Location location;
 ...
}

当然,在应用程序中创建了一个 ExtendedUser 类型的对象,并在 Service 中设置。当控制器 /list 应答请求时,尽管 Service 类中的引用是 User,但仍会序列化 ExtendedUser 类型的对象。我想知道是否有某种方法可以使用注释来仅序列化超类型(引用的类型)并避免子类型属性。

考虑到示例,我想要返回一个不带位置属性的 JSON。

提前致谢

java json spring spring-mvc spring-annotations
4个回答
0
投票

我认为这会成功:

@JsonSerialize(using=User.class)

请参阅此相关答案:https://stackoverflow.com/a/13926740/1292605


0
投票

我建议使用@JsonSerialize的

as
属性。顺便说一句,@JsonSerialize 可以在字段上声明,这样就不会影响
User
ExtendedUser
序列化的常见行为。

public class Service {
  @JsonSerialize(as = User.class)
  private User user;
  ...
}

0
投票

@JsonInclude(Include.NON_NULL)
上尝试
ExtendedUser


0
投票

您的“我想要一个不返回位置属性的 JSON”声明可以使用

@JsonIgnore
注释轻松完成:

public class ExtendedUser extends User {
    @JsonIgnore
    private Location location;
     ...
}

这就是您想要做的,只是从响应中删除位置,还是返回的实际类型(类型 id)很重要?如果我的说法不对,请发布您预期的 JSON 结果和实际的 JSON 结果。

© www.soinside.com 2019 - 2024. All rights reserved.