티스토리 뷰
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 내부적으로는:
- JsonNode를 중간에 직렬화(serialization) → JSON 문자열로 바꾸고
- 다시 역직렬화(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