이 튜토리얼에서는 Java에서 다양한 라이브러리를 사용해 JSON을 구문 분석(파싱)하는 방법을 살펴봅니다.
JSON은 JavaScript Object Notation의 약자로, JavaScript 문법의 일부를 기반으로 하는 경량 데이터 형식입니다.
JSON은 데이터 교환 형식으로써 웹 프로그래밍 분야에서 매우 널리 사용되고 있습니다. 여기서는 대표적인 라이브러리인 org.json, Gson, 그리고 JsonPath를 활용해 Java에서 JSON을 파싱하는 방법을 소개합니다.
먼저 기본 개념부터 짚고 넘어가겠습니다. JSON 객체(object)는 키/값(key/value) 쌍들이 순서 없이 모인 집합이며, JSON 배열(array)은 값들이 순서대로 나열된 컬렉션입니다. 배열 안의 값 자체가 또 다른 객체나 배열일 수도 있습니다.
아래 JSON 예제를 파싱하여 pageName, pagePic, post_id 값을 추출하는 과정을 단계별로 확인해 보겠습니다.
{
"pageInfo": {
"pageName": "Homepage",
"logo": "https://www.example.com/logo.jpg"
},
"posts": [
{
"post_id": "0123456789",
"actor_id": "1001",
"author_name": "Jane Doe",
"post_title": "How to parse JSON in Java",
"comments": [],
"time_of_post": "1234567890"
}
]
}
org.json 라이브러리로 JSON 파싱하기
org.json을 사용해 Java에서 JSON을 파싱하려면 먼저 해당 라이브러리를 의존성(dependency)으로 추가해야 합니다. Maven 중앙 저장소에서 최신 버전을 받을 수 있습니다.
import org.json.JSONArray;
import org.json.JSONObject;
public class ParseJSON {
static String json = "...";
public static void main(String[] args) {
JSONObject obj = new JSONObject(json);
String pageName = obj.getJSONObject("pageInfo").getString("pageName");
System.out.println(pageName);
JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++) {
String post_id = arr.getJSONObject(i).getString("post_id");
System.out.println(post_id);
}
}
}
참고: 위 코드의 ... 부분에는 실제 JSON 문자열이 들어가야 합니다. 코드의 간결함을 위해 생략된 것입니다.
먼저 JSONObject 클래스를 사용해 JSON 문자열을 JSON 객체로 변환해야 합니다.
그리고 주목할 점은 "pageInfo"가 JSON 객체이므로 getJSONObject 메서드를 사용한다는 것입니다.
마찬가지로 "posts"는 JSON 배열이므로 getJSONArray 메서드를 사용해야 합니다.
관련 글
- Java 객체를 JSON으로 변환하는 방법
- Java Map을 JSON으로 변환하는 방법
- JSON 인코딩 및 디코딩 방법
Gson 라이브러리로 JSON 파싱하기
Gson을 사용해 Java에서 JSON을 파싱하려면 역시 라이브러리를 의존성으로 추가해야 합니다. Maven 중앙 저장소에서 최신 버전을 내려받을 수 있습니다.
다음 예제는 앞서 살펴본 동일한 JSON을 Gson으로 파싱하는 방법을 보여줍니다.
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class ParseJSON {
static String json = "...";
public static void main(String[] args) {
JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
String pageName = jsonObject.getAsJsonObject("pageInfo").get("pageName").getAsString();
System.out.println(pageName);
JsonArray arr = jsonObject.getAsJsonArray("posts");
for (int i = 0; i < arr.size(); i++) {
String post_id = arr.get(i).getAsJsonObject().get("post_id").getAsString();
System.out.println(post_id);
}
}
}
앞선 예제와 마찬가지로 ... 부분은 실제 JSON 문자열로 대체해야 합니다.
JsonPATH 라이브러리로 JSON 파싱하기
앞서 소개한 두 가지 방식은 원하는 속성 값에 접근하기 전에 JSON 전체를 Java 객체로 완전히 역직렬화(deserialization)해야 합니다. 이와 달리 다른 접근 방식으로 JsonPath를 사용할 수 있습니다. JsonPath는 XML의 XPath처럼 JSON에 대한 경로 표현식을 제공하며, JSON 객체를 자유롭게 탐색할 수 있게 해줍니다.
마찬가지로 Maven 중앙 저장소에서 JsonPath를 의존성으로 추가하면 바로 사용할 수 있습니다.
예를 들어 위의 JSON을 파싱하려면 다음과 같이 작성합니다:
import com.jayway.jsonpath.JsonPath;
public class ParseJSON {
static String json = "...";
public static void main(String[] args) {
String pageName = JsonPath.read(json, "$.pageInfo.pageName");
System.out.println(pageName);
Integer posts = JsonPath.read(json, "$.posts.length()");
for(int i=0; i < posts; i++) {
String post_id = JsonPath.read(json, "$.posts[" + i + "].post_id");
System.out.println(post_id);
}
}
}