반응형
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피셜) 테스트는 안해봤다.
반응형
'공부 > 백엔드' 카테고리의 다른 글
| [스프링 부트 핵심 가이드] 1~3 : 스프링부트, MVC, 디자인패턴 (0) | 2024.04.25 |
|---|---|
| Backend 개발자 커리어 로드맵 (어떤 백엔드 개발자로 성장할까?) (0) | 2024.02.22 |
| Controller에서 값을 받는 방법들 - RequestParam, RequestBody, ModelAttribute, PathVariable, HttpServletRequest, MultipartHttpServletRequest (0) | 2023.10.14 |
| Ajax의 기본 정리! view-controller 통신 (비동기) (2) | 2023.10.13 |
| [Web] Kopring이 뭘까? : Spring+Kotlin 웹 (0) | 2023.07.27 |