[스프링부트] SpringBoot ObjectMapper

Harry park·2021년 12월 26일
0

SpringBoot

목록 보기
1/11
post-thumbnail

Springboot Object Mapper

📌 Object Mapper란 ?

  • 텍스트 형태의 JSON을 object로 변경해 주거나 object를 텍스트 형태의 JSON으로 변경해 주는 것을 의미한다.
  • 예를 들면 컨트롤러에 요청이 오면, Content-Type이 JSON타입인 것을 object로 변경을 해주고, 처리 후 응답으로 클라이언트에 자동으로 Object를 요청 형태에 해당되는 json으로 변경해준다.

📌 Object Mapper 사용방법

의존성 주입

👉 Maven

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

👉 Gradle

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
// 코드중략
dependencies {
  // 코드중략
  implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'
  // 코드중략
}
// 코드중략

Object Mapper 사용

📖 Text JSON을 Object로 변경

  • ObjectMapper는 getter를 통해 데이터를 파싱해주기 때문에 getter가 업는 경우 JSON을 Object 형태로 변경하지 못한다.

💻 코드

var objectMapper = new ObjectMapper();

var user = new User("Harry", 30);
var text = objectMapper.writeValueAsString(user);

var objectUser = objectMapper.readValue(text, User.class);
System.out.println(objectUser);

📖 Object를 Text JSON로 변경

  • ObjectMapper가 객체를 변환하는 경우에는 default생성자가 있어야 한다.
    객체명에 get을 붙이는 경우 ObjectMapper가 getter로 인식하기 때문에 사용을 유의해야한다.

💻 코드

var objectMapper = new ObjectMapper();

var user = new User("Harry", 30);
var text = objectMapper.writeValueAsString(user);
System.out.println(text);

💻 코드(전체)

package com.example;

import com.example.tldspringboot.dto.MapperCar;
import com.example.tldspringboot.dto.MapperUser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.Arrays;
import java.util.List;

public class TestMain {

    public static void main(String[] args) throws JsonProcessingException {
        System.out.println("---main----");

        ObjectMapper objectMapper = new ObjectMapper();

        MapperUser user = new MapperUser();
        user.setName("홍길동");
        user.setAge(10);

        MapperCar car1 = new MapperCar();
        car1.setCarName("A6");
        car1.setCarNumber("11가 1111");
        car1.setType("SEDAN");

        MapperCar car2 = new MapperCar();
        car2.setCarName("X6");
        car2.setCarNumber("11나 1111");
        car2.setType("SUV");

        List<MapperCar> carList = Arrays.asList(car1, car2);
        user.setCarList(carList);
		
        String json = objectMapper.writeValueAsString(user);

        //System.out.println(json);

        JsonNode jsonNode = objectMapper.readTree(json);
        String _name = jsonNode.get("name").asText();
        int _age  = jsonNode.get("age").asInt();

        JsonNode cars = jsonNode.get("carList");
        ArrayNode arrayNode = (ArrayNode)cars;

        List<MapperCar> _carList = objectMapper.convertValue(arrayNode, 
        new TypeReference<List<MapperCar>>() {});

        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.put("name", "harry");
        objectNode.put("age", "20");
 		System.out.println(objectNode.toPrettyString());
    }
}

Object Mapper Advanced Features

  • serialization and deserializationcustomize를 지원한다.

📖 JSON에는 있지만 Mapping될 Object에는 없는 필드를 무시해야하는 경우

💻 코드

String jsonString 
  = "{ \"color\" : \"Black\", \"type\" : \"Fiat\", \"year\" : \"1970\" }";

Key, valuevaluenull인 경우, UnrecognizedPropertyException exception이 발생한다.

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESfalse로 설정하면 Exception이 발생하지 않는다.

📖 JSON에 있는 propety가 Mapping될 Object에 primitive인데 null 값이 전달을 무시해야하는 경우

String jsonString 
  = "{ \"color\" : \"Black\", \"type\" : \"Fiat\", \"year\" : \"1970\" }";

objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
User user = objectMapper.readValue(jsonString, User.class);

참고사이트

profile
Jr. Backend Engineer

0개의 댓글