将两个不同的 JSON 表示反序列化为一个对象
Deserialize two different JSON representations into one object
我有Javaclass喜欢
@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{}
}
并将它们应用到初始 class
@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;
}
但不知何故它完全失败了。它完全失败了,即。什么都没有过滤。是龙目岛的问题吗?还是定义不正确?
你如何序列化你的对象?你在使用 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);
我有Javaclass喜欢
@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{}
}
并将它们应用到初始 class
@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;
}
但不知何故它完全失败了。它完全失败了,即。什么都没有过滤。是龙目岛的问题吗?还是定义不正确?
你如何序列化你的对象?你在使用 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);