자바에서 JSON 데이터를 다룰 일이 많다. 특히 REST API를 통해 데이터를 가져오는 경우 JSON 포맷을 사용하는 경우가 많기 때문에 JSON을 다루는 예제를 알아두면 좋다.
자바에서 JSON 포맷을 다루는 방법은 다양하지만 가장 간단한 방법인 'json-simple' 패키지를 이용하는 방법을 정리해보겠다.
Maven 설정
json-simple 패키지를 사용하기 위해서 다음과 같은 메이븐(Maven) Dependency 설정이 필요하다.
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
버전 정보는 적당한 걸 넣어주면 된다.
JSON 파싱해보기
JSON으로 표현된 데이터를 다루기 위해서 json-simple 패키지에서 다음 클래스들을 사용하면 된다.
- JSONParser
- JSONObject
- JSONArray
예제로 살펴보자.
String json1 = “{\”name\”:\”Dave\”, \”nationality\”:\”korea\”}”;
String json2 = “[{ ... }, {....}]”;
JSONParser parser = new JSONParser();
Object object = (JSONObject)parser.parse(json1)
If (object instanceof JSONArray) {
JSONArray jsonArray = (JSONArray)object;
// jsonArray 클래스를 이용한 처리
}
Else if (object instance JSONObject) {
JSONObject jsonObject = (JSONObject)object;
// jsonObject 클래스를 이용한 처리
}
Else {
// Other types
}
우선 JSONParser 클래스를 이용해서 json 문자열을 파싱한다. 파싱된 결과는 JSONObject 타입의 객체일 수도 있고, JSONArray 타입의 객체일 수도 있다. JSONObject 타입은 '{' 문자로 시작하는 객체를 의미하며, JSONArray는 '[' 문자로 시작하는 여러 객체 혹은 타입들의 배열을 의미한다.
JSONParser의 parse() 메소드를 이용해 JSON 문자열을 파싱하고, 리턴된 객체를 Object 로 받는다. 그리고 instanceof 를 이용해 JSONObject인지 JSONArray인지를 파악한다.
JSONObject
리턴받은 객체가 JSONObject인 경우를 생각해보자. 다음의 JSON 문자열이 있다고 하자.
{ "name" : "dave", "department" : { "name" : "hr", "location" : "seoul" }}
이 JSON 객체에서 name 값을 얻어오기 위해서는 get 메소드를 사용하면 된다.
JSONObejct jsonObject = (JSONObject)parser.parse(json);
String name = (String)jsonObject.get("name");
System.out.println(name);
이 때, get 메소드에 얻어올 하위 요소의 이름을 입력하면 Object 타입으로 리턴된다. 위 코드에서 만약 name 항목이 문자열이 아닌 또 다른 객체였다면(Firstname, Lastname 두 요소를 포함하는) 에러가 발생한다. 따라서 필요한 경우 instanceof 등을 이용해서 확인한 다음 사용해야 할 수 있다.
위에서 본 JSON 객체에 .get("name")을 실행하면 String 객체가 리턴되고, get("department")를 실행하면 JSONObject 객체가 리턴된다.
JSONArray
JSONArray 객체의 경우 다음과 같은 JSON을 파싱하면 얻을 수 있다.
[ { "name" : "dave", "department" : {"name" : "hr", "location" : "seoul"}}, {"name" : "paul", "department" : {"name" : "development", "location" : "tokyo"}}]
두 개의 JSON 객체를 하나의 JSON 배열로 묶어 놓은 개념이다. 사용법은 JSONObject와 비슷하다.
JSONArray jsonArray = (JSONArray)parser.parse(json);
JSONObject jsonObject = (JSONObject)jsonArray.get(1);
String name = jsonObject.get("name");
System.out.println(name);
다만 배열이기 때문에 get() 메소드의 인자로 엘리먼트의 이름이 아니라 몇 번째 엘리면트를 가지고 올 것인지 인덱스 숫자를 입력하게 된다. 역시 리턴되는 결과는 Object 타입이며 instanceof 로 확인하고 사용하면 된다.
댓글