JSON(JavaScript Object Notation)은 경량(lightweight)이며 텍스트 기반이고 언어에 독립적인 데이터 교환 형식입니다. JSON은 객체(Object)와 배열(Array)이라는 두 가지 구조화된 타입을 표현할 수 있습니다.
Java에서는 json.simple API가 제공하는 JSONObject와 JSONArray 클래스를 사용하여 JSON 객체를 손쉽게 디코딩할 수 있습니다. 이때 JSONObject는 java.util.Map처럼 동작하고, JSONArray는 java.util.List처럼 동작하기 때문에 익숙한 컬렉션 API 방식으로 데이터에 접근할 수 있다는 점이 큰 장점입니다.
JSON 디코딩 예제 코드
아래 예제에서는 문자열 형태의 JSON을 파싱하여 배열 요소와 객체의 필드 값을 추출하는 과정을 보여줍니다.
import org.json.simple.*;
import org.json.simple.parser.*;
public class JSONDecodingTest {
public static void main(String[] args) {
JSONParser parser = new JSONParser();
String str = "[ 0 , {\"1\" : { \"2\" : {\"3\" : {\"4\" : [5, { \"6\" : { \"7\" : 8 } } ] } } } } ]";
try {
Object obj = parser.parse(str);
JSONArray array = (JSONArray) obj;
System.out.println("2nd Array element: ");
System.out.println(array.get(1));
System.out.println();
JSONObject object2 = (JSONObject) array.get(1);
System.out.println("Field \"1\"");
System.out.println(object2.get("1"));
str = "{}";
obj = parser.parse(str);
System.out.println(obj);
str = "[6]";
obj = parser.parse(str);
System.out.println(obj);
str = "[6,,3]";
obj = parser.parse(str);
System.out.println(obj);
} catch (ParseException parseExp) {
System.out.println("Exception position: " + parseExp.getPosition());
System.out.println(parseExp);
}
}
}
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
2nd Array element:
{"1":{"2":{"3":{"4":[5,{"6":{"7":8}}]}}}}
Field "1"
{"2":{"3":{"4":[5,{"6":{"7":8}}]}}}
{}
[6]
[6,3]
코드 설명
JSONParser의 parse() 메서드는 JSON 문자열을 파싱하여 Object로 반환합니다. 반환된 객체가 배열이면 JSONArray로 캐스팅하고, 객체라면 JSONObject로 캐스팅하여 사용하면 됩니다. 또한 파싱 중 문법 오류가 발생하면 ParseException이 던져지며, getPosition() 메서드를 통해 오류가 발생한 위치를 확인할 수 있어 디버깅에 유용합니다.