본문 바로가기
백엔드/Java

JSON 문자열 List 타입 파싱할때 LinkedHashMap으로 변환되는 문제

by 1005ptr 2020. 9. 26.
반응형

이렇게 되는 이유는 JAVA의 제네릭이 컴파일까지만 유지되고 실행단계에서는 사라져버리기 때문이다.

 

이번 상황은

GET 요청 URL에 JSON 포맷으로 데이터가 들어온다.

자동 파싱이 안돼서 문자열로 받고 바꾸는 작업

 

아래 new TypeReference<List<T>>() {} 부분이 문제다.

List도 Generic이기 때문에 List<T>가 실행단계에서는 List가 돼버린다. (타입이 없다...)

그래서 자바는 어 이게 뭐지 하고 LinkedHashMap으로 만들어서 넣음.

public void setFilter(String filter) throws Exception {
	this.filter = filter;
	this.setFilterList(this.<FilterItem>parseJson(this.filter));
}
    
private <T> List<T> parseJson(String jsonString) throws Exception{
	ObjectMapper objectMapper = new ObjectMapper();
	try {
		return objectMapper.readValue(jsonString, new TypeReference<List<T>>() {});
	} catch (IOException e) {
    	throw 예외
	}
}

 

그래서 어떻게 해야되냐.

제네릭이 중첩되는 경우 T를 넣으면 안된다. 타입을 명시해줘야된다. (내생각)

그럴려면? 밖에서 타입을 적어서 만든걸 전달해주기로 했다.

public void setFilter(String filter) throws Exception {
	this.filter = filter;
	this.setFilterList(this.parseJson(this.filter, new TypeReference<List<FilterItem>>() {}));
}
    
private <T> List<T> parseJson(String jsonString, TypeReference<List<T>> type) throws Exception{
	ObjectMapper objectMapper = new ObjectMapper();
	try {
		return objectMapper.readValue(jsonString, type);
	} catch (IOException e) {
		throw 예외
	}
}

컴파일할때는 에러도 안나고

런타임중에 foreach문 돌렸는데 터져서 알게됐다.

원래 자바에 제네릭이 반쪽 제네릭이라 사라지는건 알았는데 참 이상한일이다. 왜저렇게 해놨지...

반응형

댓글