자바(Java)에서 Map 객체를 JSON으로 변환해야 하는 상황은 매우 흔합니다. 배열(Array)이나 Map을 JSON으로 직렬화하거나, 그 반대로 역직렬화하는 작업은 API 통신이나 데이터 처리 과정에서 자주 마주치게 됩니다.
이 글에서는 Jackson, Gson, org.json 세 가지 대표적인 라이브러리를 사용해 Java Map을 JSON으로 변환하는 방법을 예제 코드와 함께 살펴봅니다.
1. Jackson을 사용한 Java Map → JSON 변환
첫 번째 예제는 Jackson Core와 Jackson Databind 라이브러리를 활용하는 방식입니다.
Jackson 라이브러리를 사용하려면 먼저 프로젝트의 pom.xml 파일에 다음 의존성을 추가해야 합니다.
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
의존성을 추가했다면 아래와 같이 ObjectMapper를 사용해 Map을 JSON 문자열로 변환할 수 있습니다.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
public class ConvertJavaMapToJson {
@Test
public void convertMapToJson() {
Map<String, String> elements = new HashMap();
elements.put("Key1", "Value1");
elements.put("Key2", "Value2");
elements.put("Key3", "Value3");
ObjectMapper objectMapper = new ObjectMapper();
try {
String json = objectMapper.writeValueAsString(elements);
System.out.println(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
실행 결과:
{"Key2":"Value2","Key1":"Value1","Key3":"Value3"}
출력 결과를 보면 JSON에 담긴 요소들의 순서가 Map에 입력했던 순서와 다른 것을 확인할 수 있습니다. 이는 HashMap이 요소의 순서를 보장하지 않기 때문입니다.
만약 삽입한 순서(또는 키 기준 정렬 순서)를 유지하고 싶다면 HashMap 대신 SortedMap을 사용하면 됩니다.
예를 들어 다음과 같이 선언합니다.
SortedMap<String, String> elements = new TreeMap();
실행 결과:
{"Key1":"Value1","Key2":"Value2","Key3":"Value3"}
- Java에서 JSON 파싱하는 방법
- JSON 인코딩 및 디코딩 방법
- Java Object를 JSON으로 변환하는 방법
2. Gson을 사용한 Java Map → JSON 변환
두 번째 예제는 Google의 Gson 라이브러리를 사용하는 방식입니다. 마찬가지로 먼저 pom.xml에 Gson 의존성을 추가해야 합니다.
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
</dependencies>
Gson에서는 TypeToken을 사용해 제네릭 타입 정보를 전달하면서 Map을 JSON으로 변환합니다.
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Type;
import java.util.SortedMap;
import java.util.TreeMap;
public class ConvertJavaMapToJson {
@Test
public void convertMapToJson() {
SortedMap<String, String> elements = new TreeMap();
elements.put("Key1", "Value1");
elements.put("Key2", "Value2");
elements.put("Key3", "Value3");
Gson gson = new Gson();
Type gsonType = new TypeToken<HashMap>(){}.getType();
String gsonString = gson.toJson(elements, gsonType);
System.out.println(gsonString);
}
}
실행 결과:
{"Key1":"Value1","Key2":"Value2","Key3":"Value3"}
TreeMap을 사용했기 때문에 키를 기준으로 정렬된 순서대로 JSON이 생성된 것을 볼 수 있습니다.
3. org.json을 사용한 Java Map → JSON 변환
세 번째 예제는 org.json 라이브러리를 사용하는 방식입니다. 이 라이브러리는 JSONObject 생성자에 Map을 그대로 넘겨주면 되기 때문에 코드가 가장 간결합니다.
<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
</dependencies>
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
public class ConvertJavaMapToJson {
@Test
public void convertMapToJson() {
Map<String, String> elements = new HashMap<>();
elements.put("Key1", "Value1");
elements.put("Key2", "Value2");
elements.put("Key3", "Value3");
JSONObject json = new JSONObject(elements);
System.out.println(json);
}
}
실행 결과:
{"Key2":"Value2","Key1":"Value1","Key3":"Value3"}
마무리: 어떤 라이브러리를 선택해야 할까?
세 가지 라이브러리 모두 Java Map을 JSON으로 손쉽게 변환할 수 있습니다. 상황에 따라 다음과 같이 선택하는 것을 추천합니다.
- Jackson: Spring Boot 등 대규모 프레임워크 환경에서 사실상 표준처럼 사용되며, 성능과 기능 면에서 가장 강력합니다.
- Gson: Google에서 개발한 경량 라이브러리로, 안드로이드 프로젝트나 간단한 직렬화 작업에 적합합니다.
- org.json: 의존성이 가볍고 사용법이 단순해, 빠르게 프로토타이핑하거나 간단한 JSON 처리에 유용합니다.
또한 요소의 순서가 중요하다면 HashMap 대신 LinkedHashMap(삽입 순서 유지)이나 TreeMap(키 정렬 순서 유지)을 사용하는 점도 기억해 두세요.