티스토리 뷰

Java

[Java] Jackson readValue(), convertValue()

snail voyager 2025. 4. 20. 00:19
728x90
반응형

readValue()

Jackson에서 JSON을 DTO 클래스(POJO)에 매핑할 때 사용

String json = "{ \"id\": 1, \"name\": \"Alice\", \"age\": 28 }";

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);

convertValue()

JsonNode를 POJO 또는 Map/Collection으로 변환하는 메서드

JsonNode node = mapper.readTree(json);
User user = mapper.convertValue(node, User.class);

Jackson 내부적으로는:

  1. JsonNode를 중간에 직렬화(serialization) → JSON 문자열로 바꾸고
  2. 다시 역직렬화(deserialization) → Map으로 변환
convertValue(JsonNode node, Map.class)

// 내부적으로 이런 순서로 처리됨
String tempJson = mapper.writeValueAsString(userNode);
Map<String, Object> map = mapper.readValue(tempJson, new TypeReference<>() {});

readValue() vs convertValue()

메서드 주요  용도 입력 값예시
readValue() JSON → DTO String, InputStream, Reader, byte[], JsonParser 등 mapper.readValue(json, User.class)
convertValue() 다른 타입 → DTO Map, JsonNode, 다른 POJO 등 mapper.convertValue(jsonNode, User.class)

TypeReference

TypeReference<T>는 Jackson에서 **제네릭 타입(특히 List<T>, Map<K, V> 같은 복잡한 타입)**을 안전하게 처리하기 위해 사용하는 클래스

  • Java는 **런타임에 제네릭 타입 정보를 지우는 타입 소거(Type Erasure)**라는 특징
  • Jackson이 List<User>나 Map<String, Object> 같은 제네릭 타입을 파싱할 때 타입 정보를 알 수 없음
  • 그래서 Jackson에게 "정확한 타입 정보를 알려주는" 방법이 TypeReference
String json = "[{\"id\":1,\"name\":\"Alice\"}, {\"id\":2,\"name\":\"Bob\"}]";
ObjectMapper mapper = new ObjectMapper();

// List<User> 타입으로 읽기
List<User> users = mapper.readValue(json, new TypeReference<List<User>>() {});

Map<String, List<User>> 중첩된 제네릭 타입

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
          "group1": [
            { "id": 1, "name": "Alice" },
            { "id": 2, "name": "Bob" }
          ],
          "group2": [
            { "id": 3, "name": "Charlie" },
            { "id": 4, "name": "Diana" }
          ]
        }
        """;

        ObjectMapper mapper = new ObjectMapper();

        // 중첩 제네릭 타입: Map<String, List<User>>
        Map<String, List<User>> result = mapper.readValue(
            json,
            new TypeReference<Map<String, List<User>>>() {}
        );

        // 출력 확인
        result.forEach((group, users) -> {
            System.out.println("== " + group + " ==");
            users.forEach(System.out::println);
        });
    }
}

== group1 ==
User{id=1, name='Alice'}
User{id=2, name='Bob'}
== group2 ==
User{id=3, name='Charlie'}
User{id=4, name='Diana'}

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] Jackson Streaming API, TreeModel  (0) 2025.04.19
[Java] BigInteger  (0) 2025.04.19
[Java] BigDecimal  (0) 2025.04.19
[Java] DIP (Dependency Inversion Principle)  (0) 2025.03.03
[Java] Bounded WildCard  (1) 2025.03.03
반응형
300x250