本篇介紹在呼叫Spring Boot Web MVC時,如何設定JSON屬性命名慣例與Java物件屬性命名慣例格式的轉換,例如Snake Case與小駝峰(Lower Camel Case)互相轉換。
首先建立一個Spring Boot Web MVC專案。
專案的application.properties
內容目前如下。
application.properties
#context
server.servlet.context-path=/demo
server.port=8080
現在有一個DemoController
,其中有一個接收與回傳JSON資料的API方法如下。
DemoController
@RestController
public class DemoController {
@PostMapping("/test")
public ResponseDto getEmployee(@RequestBody RequestDto requestDto) {
System.out.println(requestDto.getRequestId());
System.out.println(requestDto.getRequestMessage());
ResponseDto responseDto = new ResponseDto();
responseDto.setResponseId(10001);
responseDto.setResponseMessage("SUCCESS");
return responseDto;
}
}
JSON傳入轉成的物件RequestDto
與傳出轉成JSON的物件ResponseDto
。
RequestDto
public class RequestDto {
private Integer requestId;
private String requestMessage;
// getter setter...
}
ResponseDto
public class ResponseDto {
private Integer responseId;
private String responseMessage;
// getter setter...
}
對外的API格式如下。
Request|POST|/test
{
request_id: int,
request_message: string
}
Response
{
request_id: int,
request_message: string
}
JSON的命名慣例為Snake Case,也就是多個字間以底線_
分隔,不同於Java物件屬性的小駝峰(Lower Camel Case)命名慣例。
JSON與物件屬性命名慣例的全局轉換可在application.properties
中設定
spring.jackson.property-naming-strategy=SNAKE_CASE
就會自動轉換。
application.properties
#context
server.servlet.context-path=/demo
server.port=8080
# covert JSON snake case naming properites to Java lower camel case naming properites
spring.jackson.property-naming-strategy=SNAKE_CASE
設定完以上後,以POST傳送以下請求至http://localhost:8080/demo/test
{
"request_id": 10000,
"request_message": "REQUEST MESSAGE"
}
在Eclipse終端機印出以下結果。
10000
REQUEST MESSAGE
回傳的Response body內容如下。
{
"response_id": 20000,
"response_message": "RESPONSE MESSAGE"
}
spring.jackson.property-naming-strategy
的設定值如下。
SNAKE_CASE
:底線分隔,轉hello_world
UPPER_CAMEL_CASE
:大駝峰,轉HelloWorld
LOWER_CAMEL_CASE
:小駝峰,轉helloWorld
LOWER_CASE
:全小寫無分隔,轉helloworld
KEBAB_CASE
:減號分隔,轉hello-world
如果僅要針對單一的物件進行轉換,可在物件類別前使用@JsonNaming
,值為繼承PropertyNamingStrategy
的子類別。
例如下面僅對RequestDto
與ResponseDto
物件進行轉換。
RequestDto
import com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
@JsonNaming(SnakeCaseStrategy.class)
public class RequestDto {
private Integer requestId;
private String requestMessage;
// getter setter...
}
ResponseDto
import com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
@JsonNaming(SnakeCaseStrategy.class)
public class ResponseDto {
private Integer responseId;
private String responseMessage;
// getter setter...
}
@JsonNaming
的設定值如下。
SnakeCaseStrategy
:底線分隔,轉hello_world
UpperCamelCaseStrategy
:大駝峰,轉HelloWorld
LowerCaseStrategy
:全小寫無分隔,轉helloworld
KebabCaseStrategy
:減號分隔,轉hello-world
請參考com.fasterxml.jackson.databind.PropertyNamingStrategy
。
沒有留言:
張貼留言