JSON 파싱은 어떻게 할까?
목차
- JSON이란?
- 의존성 추가
- JSON 파싱 기본 개념
- JSON 파싱 방법
JSON이란?
JSON(JavaScript Object Notation)은 키-값 쌍을 사용하여 데이터를 계층적 방식으로 표현하는 데이터 형식입니다.
JSON 예제
{
"name": "Jane Smith",
"age": 35,
"city": "San Francisco",
"phone": "014158889275",
"email": "janesmith@sample.com"
}
특징
- 웹 개발에서 서버와 웹 애플리케이션 간 데이터 교환에 널리 사용
- 사람이 읽고 쓰기 쉬운 텍스트 기반 형식
- 프로그래밍 언어와 플랫폼에 독립적
의존성 추가
Gradle
dependencies {
// JSON-Simple
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
// 또는 Jackson (Spring Boot에 기본 포함)
implementation 'com.fasterxml.jackson.core:jackson-databind'
}
Maven
<dependencies>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies>
참고: Spring Boot 프로젝트는 Jackson이 기본으로 포함되어 있어 별도 추가가 필요 없음!
JSON 파싱 기본 개념
JSON 파싱이란?
JSON 문자열을 프로그래밍 언어의 데이터 구조로 변환하는 과정을 의미
주요 클래스/라이브러리
| 클래스/라이브러리 | 역할 | 특징 |
|---|
| JSONParser | JSON 문자열을 파싱하여 JSON 객체/배열 생성 | 파싱 전용 |
| JSONObject | 키-값 형태로 데이터 저장 (Map<String, Object> 구조) | put(), get() 메서드 제공 |
| JSONArray | 여러 JSON 객체를 담는 배열 컨테이너 | 배열 순회 및 접근 |
| ObjectMapper | JSON ↔ Java 객체 자동 변환 (Jackson) | 타입 안정성, 자동 매핑 |
JSON 파싱 방법
1. JSON-Simple
특징
- 가볍고 단순한 JSON 라이브러리
- 복잡한 기능 없음
- 수동 타입 변환 필요
언제 사용?
- JSON 데이터가 이미 String 형태로 존재할 때
.json 파일에서 Reader를 통해 텍스트를 읽어들일 때
예제
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.json.simple.JSONObject;
public class JsonSimpleExample {
public static void main(String[] args) {
String jsonString = "{\"title\":\"Java 연습\",\"pages\":120}";
try {
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject) parser.parse(jsonString);
String title = (String) obj.get("title");
Long pages = (Long) obj.get("pages");
System.out.println("title: " + title);
System.out.println("pages: " + pages);
} catch (ParseException e) {
System.out.println("파싱 오류: " + e.getMessage());
}
}
}
출력
title: Java 연습
pages: 120
단점
- 타입 변환을 직접 처리해야 함 (
(String), (Long) 등)
- 유지보수성이 떨어짐
- 타입 안정성이 낮음
2. JSONObject (org.json)
특징
- JSON-Simple보다 조금 더 편리
- 여전히 수동 파싱 스타일
- 내부적으로 문자열 파싱 기능 포함
언제 사용?
- 단일 JSON 객체를 다룰 때
- 간단한 키-값 접근이 필요할 때
예제
import org.json.JSONObject;
public class JsonObjectExample {
public static void main(String[] args) {
String jsonString = "{\"title\":\"Java 연습\",\"pages\":120}";
try {
JSONObject obj = new JSONObject(jsonString);
String title = obj.getString("title");
int pages = obj.getInt("pages");
System.out.println("title: " + title);
System.out.println("pages: " + pages);
} catch (Exception e) {
e.printStackTrace();
}
}
}
출력
title: Java 연습
pages: 120
단점
- 자동 매핑 없음 → 매번 key를 꺼내서 수동으로 처리해야 함
- 타입 안정성이 낮음
JSONParser vs JSONObject
| 기능 | JSONParser | JSONObject |
|---|
| JSON 문자열 파싱 | ⭕ 매우 잘함 | ⭕ 제한적 |
| 데이터 보관 | ❌ 안함 | ⭕ 함 (key-value) |
put(), get() | ❌ 없음 | ⭕ 있음 |
| 주 역할 | 문자열 → 객체 변환 | 값을 담고 꺼내기 |
3. JSONArray
특징
[] 대괄호로 감싸진 배열 구조
- 안에는 여러 개의 JSONObject가 들어감
언제 사용?
[
{ "startTime": 1348, "duration": 0 },
{ "startTime": 1500, "duration": 3 }
]
- 위와 같이 여러 JSON 객체들을 목록 형태로 나열한 배열
- 다건 데이터(0~n개)를 담는 타입을 다룰 때
예제
import org.json.JSONArray;
import org.json.JSONObject;
public class JsonArrayExample {
public static void main(String[] args) {
String jsonString = "[{\"title\":\"Java 연습\",\"pages\":120}, {\"title\":\"Spring Boot\",\"pages\":300}]";
JSONArray arr = new JSONArray(jsonString);
for (int i = 0; i < arr.length(); i++) {
JSONObject obj = arr.getJSONObject(i);
String title = obj.getString("title");
int pages = obj.getInt("pages");
System.out.println("title: " + title);
System.out.println("pages: " + pages);
System.out.println("---");
}
}
}
출력
title: Java 연습
pages: 120
---
title: Spring Boot
pages: 300
---
4. Jackson ObjectMapper
특징
- JSON을 직접 JSONObject/JSONArray로 다루는 것이 아니라, Java 클래스(DTO)에 바로 매핑
- JSON ↔ 객체 자동 변환
- 타입 안정성, 유지보수성, 코드 깔끔함
언제 사용?
- 복잡한 JSON 구조를 다룰 때
- 타입 안정성이 중요한 프로젝트
- Spring Boot 프로젝트 (기본 포함)
주요 메서드
| 메서드 | 설명 | 예시 |
|---|
readValue() | JSON → Java 객체 변환 | User user = mapper.readValue(json, User.class); |
writeValueAsString() | Java 객체 → JSON 문자열 변환 | String json = mapper.writeValueAsString(user); |
writeValue() | Java 객체 → JSON 파일 저장 | mapper.writeValue(new File("user.json"), user); |
예제
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
class User {
private String name;
private int age;
}
public class ObjectMapperExample {
public static void main(String[] args) throws JsonProcessingException {
String json = "{\"name\":\"Bob\",\"age\":30}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println("name: " + user.getName());
System.out.println("Age: " + user.getAge());
String jsonString = mapper.writeValueAsString(user);
System.out.println("JSON: " + jsonString);
}
}
출력
name: Bob
Age: 30
JSON: {"name":"Bob","age":30}
장점
- 타입 안정성 보장
- 자동 매핑으로 코드 간결
- 유지보수 용이
- Spring Boot와 완벽 통합
방법별 비교 요약
| 방법 | 타입 안정성 | 코드 간결성 | 유지보수성 | 권장도 |
|---|
| JSON-Simple | ⭐ | ⭐⭐ | ⭐⭐ | ❌ |
| JSONObject | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⚠️ |
| JSONArray | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⚠️ |
| Jackson ObjectMapper | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ |
참고 자료