Jackson은 JSON을 다양한 방식으로 처리할 수 있게 해주는 대표적인 Java JSON API입니다. 이 라이브러리의 CsvMapper 클래스를 사용하면 CSV 데이터를 손쉽게 JSON 데이터로 변환할 수 있습니다.
CsvMapper는 ObjectMapper를 특수화한 클래스로, POJO(Plain Old Java Object)로부터 CsvSchema 인스턴스를 생성하는 확장 기능을 제공합니다. 또한 reader() 메서드를 사용하면 기본 설정이 적용된 ObjectReader 객체를 간편하게 구성할 수 있습니다.
CSV를 JSON으로 변환하려면 먼저 com.fasterxml.jackson.dataformat.csv 패키지를 프로젝트에 추가해야 합니다. Maven을 사용한다면 아래 의존성을 pom.xml에 추가하세요.
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>2.13.0</version>
</dependency>예제 코드
다음 예제는 헤더가 포함된 CSV 파일을 읽어 Map 형태의 리스트(JSON과 유사한 구조)로 변환하는 과정을 보여줍니다.
import java.io.*;
import java.util.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.dataformat.csv.*;
public class CsvToJsonTest {
public static void main(String args[]) throws Exception {
File input = new File("input.csv");
try {
// 첫 번째 행을 헤더로 사용하는 CSV 스키마 정의
CsvSchema csv = CsvSchema.emptySchema().withHeader();
// CsvMapper 생성 및 ObjectReader 구성
CsvMapper csvMapper = new CsvMapper();
MappingIterator<Map<?, ?>> mappingIterator =
csvMapper.reader()
.forType(Map.class)
.with(csv)
.readValues(input);
// 모든 행을 한 번에 읽어 리스트로 변환
List<Map<?, ?>> list = mappingIterator.readAll();
System.out.println(list);
} catch(Exception e) {
e.printStackTrace();
}
}
}코드 설명
- CsvSchema.emptySchema().withHeader(): 빈 스키마를 생성하고, CSV 파일의 첫 번째 행을 컬럼 이름(헤더)으로 인식하도록 설정합니다.
- csvMapper.reader().forType(Map.class): 각 CSV 행을 키-값 쌍으로 이루어진 Map 객체로 매핑합니다.
- readValues(input): 파일을 순차적으로 읽어 MappingIterator를 반환합니다.
- readAll(): 반복자의 모든 데이터를 List 형태로 한꺼번에 가져옵니다.
실행 결과
예를 들어 input.csv 파일에 다음과 같은 내용이 있다면,
first name,last name,location Ravi,Chandra,Bangalore
프로그램 실행 시 아래와 같은 결과가 출력됩니다.
[{last name=Chandra, first name=Ravi, location=Bangalore}]이처럼 Jackson의 CsvMapper를 활용하면 별도의 파싱 로직 없이도 CSV 데이터를 JSON 친화적인 구조로 간단하게 변환할 수 있습니다. 대용량 파일을 처리할 때는 readAll() 대신 MappingIterator를 순회하며 한 행씩 처리하는 방식을 사용하면 메모리 사용량을 줄일 수 있습니다.