如何在Java

时间:2018-11-28 21:31:38

标签: java json

我想从响应中排除名称和年龄,但是当我收到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"
}

4 个答案:

答案 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)

您应该拥有一个Samplename字段的age类,以及一个仅包含要包含在响应中的字段的SampleResponse类。

答案 3 :(得分:0)

没有一些棘手的技巧就无法做到。 Response Request 甚至不共享单个字段,从OOP角度来看,它们是不同的对象,那么为什么要将它们混在一起?

如果您只是尝试进行反序列化,则可以在特定的setter和getter上尝试@JsonIgnore来操纵序列化和反序列化。检查这个问题Ignoring property when deserializing

如果您实际上是想解决编写干净代码的问题,则将它们分成两个单独的类。