網頁

2019/8/28

Spring Boot Java POJO 物件與 JSON 的屬性命名慣例格式轉換設定

本篇介紹在呼叫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的設定值如下。



如果僅要針對單一的物件進行轉換,可在物件類別前使用@JsonNaming,值為繼承PropertyNamingStrategy的子類別。

例如下面僅對RequestDtoResponseDto物件進行轉換。

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的設定值如下。


請參考com.fasterxml.jackson.databind.PropertyNamingStrategy


沒有留言:

張貼留言