在Spring Web專案的RestController回傳Java物件時,Spring會自動透過Jaskson把回傳的Java物件轉換成JSON。
如果希望Java物件的屬性在某些情況下不要被轉成JSON屬性,可以設定@JsonInclude
來達成。
@JsonInclude
最常應用的情形就是當Java物件的屬性值為null
時不轉成JSON的屬性。
例如下面是一支@RestController
。
DemoController
@RestController
public class DemoController {
@PostMapping("/test")
public ResponseDto getEmployee() {
ResponseDto responseDto = new ResponseDto();
responseDto.setNum(20000);
responseDto.setStr(null);
responseDto.setStrList(null);
return responseDto;
}
}
傳出的Java物件為ResponseDto
,尚未設定@JsonInclude
。
ResponseDto
public class ResponseDto {
private Integer num;
private String str;
private List strList;
// getter setter...
}
當呼叫/test
時,回傳的結果如下,即使屬性值為null
仍轉成JSON屬性。
{
"num": 20000,
"str": null,
"strList": null
}
若希望ResponseDto
轉JSON時排除全部值為null
的屬性,可在ResponseDto
的類別名稱前加上@JsonInclude(JsonInclude.Include.NON_NULL)
。
ResponseDto
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseDto {
private Integer num;
private String str;
private List strList;
// getter setter...
}
此時呼叫/test
時,回傳的JSON就不會包含值為null
的屬性。
{
"num": 20000
}
@JsonInclude
也可針對個別屬性設定如下,改把@JsonInclude
放在屬性名稱前即可。
ResponseDto
import com.fasterxml.jackson.annotation.JsonInclude;
public class ResponseDto {
private Integer num;
private String str;
@JsonInclude(JsonInclude.Include.NON_NULL)
private List strList;
// getter setter...
}
此時呼叫/test
時,回傳的JSON就不會包含值為null
且設有@JsonInclude(JsonInclude.Include.NON_NULL)
的屬性。
{
"num": 20000,
"str": null
}
@JsonInclude
其他可用的設定值如下:
JsonInclude.Include.ALWAYS
:總是包含所有屬性。JsonInclude.Include.CUSTOM
:自訂過濾條件排除屬性。JsonInclude.Include.NON_ABSENT
:不要包含如Optional
,AtomicReference
內容為空的屬性。JsonInclude.Include.NON_DEFAULT
:不要包含預設值的屬性,例如屬性為原始型別的預設值。JsonInclude.Include.NON_EMPTY
:不要使用值為null
或內容為空的屬性。JsonInclude.Include.USE_DEFAULTS
:忽略現有層級的定義,使用高一層的定義。
沒有留言:
張貼留言