@JsonNaming

  • 스네이크 케이스로 받은 JSON 데이터를 카멜케이스 변수에 매핑시키는 방법.


json으로 넣는 값이 아래와 같다고 가정해보자.

{
  "name" : "steve",
  "age" : 20,
  "car_list" : [
    {
      "name" : "BMW",
      "car_number" : "11가 1234"
    },
    {
      "name" : "AUDI",
      "car_number" : "22가 3456"
    }
  ]
}



Controller는 아래와 같다고 가정해보자.

package com.example.put;

import com.example.put.dto.PostRequestDto;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class PutApiController {

    @PutMapping("/put")
    public PostRequestDto put(@RequestBody PostRequestDto requestDto) {

        System.out.println(requestDto);

        return requestDto;
    }
}



json 형태로 데이터를 넣기위해 필요한 Dto들은 아래와 같다고 가정해보자.
아래 예제에 Dto가 2개인 이유는 위에서 살펴봤으면 알겠지만 json data 안에 list객체가 포함되어 있기 때문이다.



package com.example.put.dto;

import java.util.List;

public class PostRequestDto {

    private String name;
    private int age;

    private List<CarDto> carList;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<CarDto> getCarList() {
        return carList;
    }

    public void setCarList(List<CarDto> carList) {
        this.carList = carList;
    }

    @Override
    public String toString() {
        return "PostRequestDto{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", carList=" + carList +
                '}';
    }
}


package com.example.put.dto;

public class CarDto {

    private String name;


    private String carNumber;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    @Override
    public String toString() {
        return "CarDto{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                '}';
    }
}


{
  "name" : "steve",
  "age" : 20,
  "car_list" : [
    {
      "name" : "BMW",
      "car_number" : "11가 1234"
    },
    {
      "name" : "AUDI",
      "car_number" : "22가 3456"
    }
  ]
}


이런식으로 작성 후 API TEST를 하면 콘솔창에는 아래와 같이 찍힌다.\


PostRequestDto{name='steve', age=20, carList=null}


이유가 뭘까?

  • 이유는 간단하다. 애초에 Dto에서 매핑은 카멜케이스로 했는데 json data는 스네이크 케이스이기 때문이다.


방법은 ?

  • @JsonNaming, @JsonProperty 어노테이션을 써볼생각이다.
  • 솔직히 @JsonNaming 어노테이션으로 클래스 전체를 감싸도 된다.
  • @JsonProperty 어노테이션은 특정변수에만 지정할 때 많이 사용한다는것만 알아두면 되겠다.



Dto에 어노테이션을 추가한 모습이다.


package com.example.put.dto;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import java.util.List;

@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PostRequestDto {

    private String name;
    private int age;

    private List<CarDto> carList;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<CarDto> getCarList() {
        return carList;
    }

    public void setCarList(List<CarDto> carList) {
        this.carList = carList;
    }

    @Override
    public String toString() {
        return "PostRequestDto{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", carList=" + carList +
                '}';
    }
}


package com.example.put.dto;

import com.fasterxml.jackson.annotation.JsonProperty;

public class CarDto {

    private String name;

    @JsonProperty("car_number")
    private String carNumber;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    @Override
    public String toString() {
        return "CarDto{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                '}';
    }
}


이렇게 어노테이션을 추가하고 다시 데이터를 보내면 아래와 같이 나온다.


PostRequestDto{name='steve', age=20, carList=[CarDto{name='BMW', carNumber='11가 1234'}, CarDto{name='AUDI', carNumber='22가 3456'}]}

Leave a comment