ObjectMapper 왜 사용하는거야?

devdo·2021년 12월 30일
0

SpringBoot

목록 보기
15/34

ObjectMapper란?

특정객체를 json으로 바꾸어놓을 때 사용한다.(직렬화) 또는 그 반대로 바꾸어놓을 때 사용한다.(역직렬화)

스프링에서는 이미 @RequestBody로 객체가 json 으로 바뀌어서 받는다. 그래서 따로 ObjectMapper를 활용하지 않는다.

하지만 Json 자체 데이타에서 컨트롤하는 상황이나 Rest Controller단 테스트코드를 작성할 때 사용할 수 있다.

ObjectMapper로 직접 json 데이타에 접근하는 방법을 배워보자.


jar 라이브러리

자바프로그램에서는 이 3개를 다 깔아줘야 한다.

jackson-databind-2.12.7.1.jar
jackson-core-2.12.7.jar
jackson-annotations-2.12.7.jar

💥 주의!
spring에서 사용하는 objectMapper 디팬더시는 Jackson Databind 이다!
따로 스프링에서 디팬더시를 걸어주지 않아도 된다.
Jackson Databind 디팬더시는 기본적으로 깔려 있다.

  • Jackson은 Java용 견고하고 성숙한 JSON 직렬화/역직렬화 라이브러리이다.
  • ObjectMapper의 API는 많은 유연성과 JSON 응답 객체를 구문 분석하고 생성하는 간단한 방법을 제공하는 것이다.

ObjectMapper 구현방법

  • ObjectMapper로 접근하기

  • 역직렬화를 위해서는 기본생성자가 반드시 필요하다.

1) 객체 -> JSON(String) : 직렬화, Response
writeValueAsString(user)

ObjectMapper objectMapper = new ObjectMapper();

User user = new User();
String json = objectMapper.writeValueAsString(user); // String(json)으로 변환

2) JSON(String) -> 객체 : 역직렬화, Request
readValue (json, User.class)

String json = "{\"name\":\"zooneon\",\"age\":25,\"address\":\"seoul\"}";

User returnUser = objectMapper.readValue(json, User.class);

sample.json

{
  "name": [
    "dsg22",
    "dsg333"
  ],
  "age": 15,
  "cars": [
    {
      "name": "K5",
      "carNumber": "11rk 1111",
      "type": "sedan"
    },
    {
      "name": "Q5",
      "carNumber": "22rk 2222",
      "type": "SUV"
    }
  ]
}

User.java

@Data
@NoArgsConstructor
public class User {

    private String name;
    private int age;
    private List<Car> cars;


    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User(String name, int age, List<Car> cars) {
        this.name = name;
        this.age = age;
        this.cars = cars;
    }

}

Car.java

@JsonProperty로 카멜케이스 -> 스네이크기법으로 바꿈

@Data
public class Car {
    private String name;

    @JsonProperty("car_number")
    private String carNumber;

    @JsonProperty("TYPE")
    private String type;
}

main문

        System.out.println("main##########");

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setAge(15);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11rk 1111");
        car1.setType("sedan");


        Car car2 = new Car();
        car2.setName("Q5");
        car2.setCarNumber("22rk 2222");
        car2.setType("SUV");

        List<Car> carList = Arrays.asList(car1, car2);
        user.setCars(carList);

        System.out.println(user);

        // 1) object -> json
        String json = objectMapper.writeValueAsString(user);

        System.out.println("json: " + json);

결과


JsonNode 구현방법

  • 접근방법
    JsonNode jsonNode = objectMapper.readTree(json);
    JsonNode cars = jsonNode.get("cars");
    ArrayNode arrayNode = (ArrayNode) cars;

  • Json 데이타 변경 방법
    ObjectNode objectNode = (ObjectNode) jsonNode;
    put()으로 변경
    objectNode.put("name", "steve");
    objectNode.put("age", 24);

  • Json 데이타 확인
    objectNode.toPrettyString()

main

// 2) JsonNode로 접근하기!
        JsonNode jsonNode = objectMapper.readTree(json);
        String _name = jsonNode.get("name").asText();
        int _age = jsonNode.get("age").asInt();

        System.out.println("name :" + _name);
        System.out.println("age :" + _age);

        JsonNode cars = jsonNode.get("cars");   // String으로 못받음!
        ArrayNode arrayNode = (ArrayNode) cars; // Array 타입으로 파싱

        List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {
        });     // List타입으로 convert
        System.out.println("_cars :" + _cars);

        // JsonNode를 쓰는 이유! 이렇게 변경이 가능!
        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.put("name", "steve");
        objectNode.put("age", 24);

        System.out.println("objectNode: " + objectNode.toPrettyString());

console

_cars :[Car(name=K5, carNumber=11rk 1111, type=sedan), Car(name=Q5, carNumber=22rk 2222, type=SUV)]
objectNode: {
  "name" : "steve",
  "age" : 24,
  "cars" : [ {
    "name" : "K5",
    "car_number" : "11rk 1111",
    "TYPE" : "sedan"
  }, {
    "name" : "Q5",
    "car_number" : "22rk 2222",
    "TYPE" : "SUV"
  } ]
}

따로 더 깊은 내용은 이 블로그를 참조하길 바란다.
https://pjh3749.tistory.com/m/281
https://velog.io/@zooneon/Java-ObjectMapper를-이용하여-JSON-파싱하기


참고

profile
배운 것을 기록합니다.

0개의 댓글