Десериализовать два разных представления JSON в один объект - PullRequest
1 голос
/ 04 октября 2019

У меня есть класс 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;
}

Я думал об использовании JsonView как

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

Но почему-то он полностью терпит неудачу. Это терпит неудачу полностью, т.е. ничего не фильтруется. Это проблема с Ломбоком. Или это определено неправильно?

1 Ответ

1 голос
/ 04 октября 2019

Как вы сериализуете свои объекты? Вы используете Spring? Используете ли вы 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 напрямую, то вам нужно указать используемый 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);
...