본문 바로가기

공부/백엔드

[ObjectMapper] json String -> List<Map> 변환

반응형

ajax에서 json을 담은 데이터들을 보내고 자바에서 받으면 Map으로 변환시킬 방법이 필요하다.

 

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.3</version>
</dependency>

 

objectMapper를 쓰기 위해선 jackson-databind 의존성을 추가해야 한다.

(최신 jackson-databind)

https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.15.3

 

1. json String -> Map

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(jsonStr, Map.class);

 

mapper.readValue(json 문자열, 변환할 형식.class)으로 변환할 수 있다.

 

2. json String -> List<Map>

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.TypeFactory;

ObjectMapper mapper = new ObjectMapper();

TypeFactory typeFactory = mapper.getTypeFactory();
JavaType javaType = typeFactory.constructParametricType(List.class, Map.class);
List<Map<String, Object>> listMap = mapper.readValue(jsonStr, javaType);

 

List<T> 형식은 제너릭 타입을 표시해주어야 하므로 다르게 작성하게 되는데, 다음과 같이 JavaType 변수로 List의 T가 Map임을 유추할 수 있게 해준다. 

 

new TypeReference<List<Map<String,Object>>>(){} 를 쓸 수 있다고 인터넷에서 보고 했는데, 왜인지

readValue(String, Class<T>) in the type ObjectMapper is not applicable for the arguments (String, new TypeReference<List<Map<String,Object>>>(){}) 라는 오류가 뜨면서 안된다.

 

@SuppressWarnings("unchecked")
List<Map<String, Object>> result = mapper.readValue(jsonData, new TypeReference<List<Map<String, Object>>>() {});

 

제너릭 경고를 무시하는 방법으로 해당 어노테이션을 쓰거나 TypeReference를 따로 변수로 빼서 사용하면 된다고도 하는데(chat gpt피셜) 테스트는 안해봤다.

반응형