首页 > 解决方案 > 将两种不同的 JSON 表示反序列化为一个对象

问题描述

我有 Java 类

@Data
public class Comment  {
  private Integer id; // should be used anyhow
  private Long refId; // for internal purpose -> not be serialized
  private String text; // should be used in QuickComment 
  private String patch; // should be included in PatchComment ONLY
  private String status; // should be included in StatusComment ONLY
}

我有

@Data
public class Response{
  private Comment statusComment;
  private Comment patchComment;
}

我想过使用JsonViewlike

public class Views{
  public interface StatusComment{}
  public interface PatchComment{}
}

并将它们应用于初始类

@Data
public class Comment  {
  @JsonView({Views.StatusComment.class, Views.PatchComment.class})
  private Integer id; // should be used anyhow
  private Long refId; // for internal purpose -> not be serialized
  @JsonView({Views.StatusComment.class, Views.PatchComment.class})
  private String text; // should be used anyhow
  @JsonView(Views.PatchComment.class)
  private String patch; // should be included in PatchComment ONLY
  @JsonView(Views.StatusComment.class)
  private String status; // should be included in StatusComment ONLY
}

Response

@Data
public class Response{
  @JsonView(Views.StatusComment.class)
  private Comment statusComment;
  @JsonView(Views.PatchComment.class)
  private Comment patchComment;
}

但不知何故,它完全失败了。它完全失败了,即。什么都没有过滤。龙目岛有问题吗?还是定义不正确?

标签: javaspringjacksonlombok

解决方案


你如何序列化你的对象?你用的是弹簧吗?你是ObjectMapper直接用的吗?

如果您使用的是 Spring,那么您需要做的是使用@JsonView(Views.StatusComment.class)@JsonView(Views.PatchComment.class)类似注释控制器的方法:

用于读取GET端点

@JsonView(Views.StatusComment.class)
@RequestMapping("/comments/{id}")
public Comment getStatusComments(@PathVariable int id) {
    return statusService.getStatuscommentById(id);
}

对于写作:

@RequestMapping(value = "/persons", consumes = APPLICATION_JSON_VALUE, method = RequestMethod.POST)
public Comment saveStatusComment(@JsonView(View.StatusComment.class) @RequestBody Comment c) {
    return statusService.saveStatusComment(c);
}

如果您ObjectMapper直接使用,那么您需要做的是指定 used View

写作时:

ObjectMapper mapper = new ObjectMapper();

String result = mapper
    .writerWithView(Views.StatusComment.class)
    .writeValueAsString(comment);

阅读时:

ObjectMapper mapper = new ObjectMapper();
Comment comment = mapper
    .readerWithView(Views.StatusComment.class)
    .forType(Comment.class)
    .readValue(json);

推荐阅读