我想从响应中排除名称和年龄,但是当我收到JSON负载请求时,我需要名称和年龄字段-在我的业务逻辑之后,我想将状态和消息作为JSON响应的一部分发送。名称和年龄应排除在外。如何在Java中实现此目标?
public class Sample {
private String name;
private String age;
private String status;
private String message;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
我的控制器类:
@PostMapping(path = "/testApp", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> test(@RequestBody Sample sample) {
Sample response = myService.calculate(sample);
return new ResponseEntity<Object>(response, HttpStatus.OK);
}
我的请求
{
"name": "Mark",
"age": "48"
}
我的回复
{
"status": "200",
"message": "success"
}
答案 0 :(得分:1)
使用Jackson进行Java / JSON序列化和反序列化提供了许多方法来控制产生和接受的JSON。
由于在某些情况下要忽略字段,所以最简单的方法是使用@JsonIgnore
注释。
@JsonIgnore可用于字段,getter和setter(以及更多)上,以始终忽略该字段,在输出到JSON时忽略或在JSON-> Java反序列化时忽略。
您的基本Sample类可以通过注释字段来始终忽略message
(在序列化和反序列化时):
public class Sample {
private String name;
private String age;
private String status;
@JsonIgnore private String message;
}
当序列化Java-> JSON时要省略字段时,可以注释 getter ;当反序列化JSON-> Java时要忽略字段时,可以注释 setter < / em>。
因此,如果要在 Sample 对象生成JSON时省略名称和年龄,则需要对这两个字段进行注释
public class Sample {
private String name;
private String age;
private String status;
private String message;
@JsonIgnore // Added Annotation
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@JsonIgnore // Added Annotation
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
使用这些注释,当您从 JSON反序列化时,将在对象中设置名称和年龄,但是在将序列化为 JSON时将不会输出它们。只有一个类,没有用于请求和响应的单独类。
答案 1 :(得分:0)
我认为您应该为请求和响应创建一个单独的类,您不能在同一个类中包含两个不同的功能,让我们假设以后您需要在请求或响应中包含一些内容,然后再次需要更改大量的代码,如果您保持隔离,那将不是问题。
答案 2 :(得分:0)
您应该拥有一个Sample
和name
字段的age
类,以及一个仅包含要包含在响应中的字段的SampleResponse
类。
答案 3 :(得分:0)
没有一些棘手的技巧就无法做到。 Response 和 Request 甚至不共享单个字段,从OOP角度来看,它们是不同的对象,那么为什么要将它们混在一起?
如果您只是尝试进行反序列化,则可以在特定的setter和getter上尝试@JsonIgnore
来操纵序列化和反序列化。检查这个问题Ignoring property when deserializing
如果您实际上是想解决编写干净代码的问题,则将它们分成两个单独的类。