JSONStringer는 JSON 텍스트를 편리하게 생성할 수 있도록 도와주는 클래스로, JSON 문법 규칙을 엄격하게 준수한 결과물을 만들어 줍니다. 하나의 JSONStringer 인스턴스는 하나의 JSON 텍스트만 생성할 수 있으며, 잘못된 구조의 JSON이 만들어지는 실수를 컴파일 단계에서 상당 부분 방지해 주기 때문에 복잡한 JSON을 직접 문자열로 조립하는 것보다 훨씬 안전합니다.
JSONStringer의 주요 메서드
JSONStringer 인스턴스는 값을 추가하기 위한 value() 메서드와, 객체 내에서 값 앞에 키를 지정하기 위한 key() 메서드를 제공합니다. 또한 다음과 같은 메서드들로 배열과 객체의 시작과 끝을 명확하게 표현할 수 있습니다.
- array() / endArray(): 배열 값의 시작과 끝을 나타냅니다.
- object() / endObject(): 객체 값의 시작과 끝을 나타냅니다.
이러한 메서드들은 체이닝(chaining) 방식으로 호출할 수 있어, 들여쓰기를 맞춰가며 읽기 쉬운 코드로 JSON을 구성할 수 있다는 장점이 있습니다.
예제 1: 기본 객체 생성
import org.json.*;
public class JSONStringerTest1 {
public static void main(String[] args) throws JSONException {
JSONStringer stringer = new JSONStringer();
String jsonStr = stringer
.object() // JSON 객체 시작
.key("Name")
.value("Raja")
.key("Age") // 키-값 쌍 추가
.value("25")
.key("City")
.value("Hyderabad")
.endObject() // JSON 객체 종료
.toString();
System.out.println(jsonStr);
}
}실행 결과
{"Name":"Raja","Age":"25","City":"Hyderabad"}예제 2: 배열과 객체의 중첩 구조
JSONStringer는 객체 안에 배열을, 배열 안에 객체를 넣는 중첩 구조도 자연스럽게 처리할 수 있습니다.
import org.json.*;
public class JSONStringerTest2 {
public static void main(String[] args) throws JSONException {
JSONStringer stringer = new JSONStringer();
String jsonStr = stringer
.array() // JSON 배열 시작
.object() // JSON 객체 시작
.key("Name").value("Adithya")
.key("Age").value("25") // 키-값 쌍 추가
.key("Mobile").value("9959984000")
.endObject() // JSON 객체 종료
.object()
.key("Address").value("Madhapur")
.key("City").value("Hyderabad")
.endObject()
.endArray() // JSON 배열 종료
.toString();
System.out.println(jsonStr);
}
}실행 결과
[{"Name":"Adithya","Age":"25","Mobile":"9959984000"},{"Address":"Madhapur","City":"Hyderabad"}]JSONStringer를 사용하면 좋은 경우
단순한 JSON이라면 JSONObject나 JSONArray로도 충분하지만, 다음과 같은 상황에서는 JSONStringer가 더 적합합니다.
- 객체와 배열이 여러 겹으로 중첩된 복잡한 JSON 구조를 만들어야 할 때
- 문자열 연결로 JSON을 직접 조립하면 따옴표나 쉼표 누락 등 문법 오류가 발생하기 쉬운 경우
- 생성 순서대로 JSON이 만들어져야 하는 스트리밍 방식의 출력이 필요한 경우
정리하면, JSONStringer는 JSON 문법 규칙을 강제하면서 가독성 높은 코드로 JSON 텍스트를 안전하게 생성하고 싶을 때 유용하게 사용할 수 있는 도구입니다.