繁体   English   中英

我如何自定义Spring Rest控制器的json输出

[英]How can I customize json output from spring rest controller

我有一个具有以下属性的POJO类患者:

public class Patient implements Serializable{

    private static final long serialVersionUID = 2L;

    private long id;
    private String name;
    private Date dob;
    private String phoneNo;
    private String email;
    private Address address;
    private String username;
    private String password;

....

现在,从我的休息控制器中,我只需要在json中发送姓名,电话号码,电子邮件和患者地址。 我期望json输出为

{
   "check":"Success",
   "details":{
      "name":"Test User",
      "phoneNo":"9876544321",
      "email":"test@gmail.com",
      "address":"Address"
   }
}

在此仅将成功/失败检查添加为标志。

只需创建另一个对象并将其用作静态控制器的响应即可;

public class PatientResponse implements Serializable {

    private static final long serialVersionUID = 2L;

    private Check check;
    private Detail details;

    // getter, setter, etc

    public static class Detail {

        private String name;
        private String phoneNo;
        private String email;
        private String address;

        // getters, setters, etc
    }

    public enum Check {
        Success, Failure
    }
}

和在控制器

@RestController
public class PatientController {

    @GetMapping(...)
    public PatientResponse get(...) {
        Patient patient = ... // get patient somehow
        return mapPatientToResponse(patient);  // map Patient to PatientResponse here
    }
}

Spring Boot使用Jackson进行JSON序列化和反序列化,请尝试使用@JSonIgnore(com.fasterxml.jackson.annotation.JsonIgnore)。

根据您的要求

PatientDTO.java

public class PatientDTO {
    private Check check;

    @JsonIgnoreProperties(value = {"id", "dob", "username", "password"})
    private Object details;

    /* Getter & Setter */

    public enum Check {
        SUCCESS("Success"),
        FAILURE("Failure");

        private String name;

        Check(String name) {
            this.name = name;
        }

        @JsonValue
        public String getName() {
            return name;
        }
    }
}

控制器演示:

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/patient")
    public PatientDTO getPatient() {
        PatientDTO patientDTO = new PatientDTO();
        patientDTO.setCheck(PatientDTO.Check.SUCCESS);
        patientDTO.setDetails(new Patient());
        return patientDTO;
    }
}

更好的方法

使用http状态


@JsonInclude(JsonInclude.Include.NON_NULL)
public class Patient {
    private long id;
    private String name;
    private Date dob;
    private String phoneNo;
    private String email;
    private Address address;
    private String username;
    private String password;

    /* Getter & Setter */
}

控制器演示:

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("patient")
    // or @ResponseStatus(HttpStatus.OK)
    public ResponseEntity<Patient> patient() {
        Patient patient = new Patient();
        patient.setId(123);
        patient.setName("123");
        patient.setEmail("demo@demo.com");
        patient.setPassword(null); // set to null to ignore password
        return ResponseEntity.ok(patient);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM