JSON Pointer는 JSON 문서 내에서 특정 키 값에 접근할 수 있도록 문자열 구문(string syntax)을 정의하는 표준입니다. Json 클래스의 정적 팩토리 메서드인 createPointer()를 호출하면 JSONPointer 인스턴스를 생성할 수 있습니다.
JSON Pointer에서 모든 문자열 구문은 반드시 "/"(슬래시)로 시작해야 한다는 점에 유의하세요. 생성한 JsonPointer 객체에 대해 getValue() 메서드를 호출하면 해당 키의 값을 손쉽게 가져올 수 있습니다.
JSON 파일
아래 예제에서 사용되는 simple.json 파일에는 이름, 나이, 주소, 전화번호 목록이 포함되어 있습니다.
예제 코드
import javax.json.*;
import java.io.*;
public class JsonPointerTest {
public static void main(String[] args) throws Exception {
JsonReader jsonReader = Json.createReader(new FileReader("simple.json"));
JsonStructure jsonStructure = jsonReader.read();
// firstName 키의 값 가져오기
JsonPointer jsonPointer1 = Json.createPointer("/firstName");
JsonString jsonString = (JsonString) jsonPointer1.getValue(jsonStructure);
System.out.println("First Name: " + jsonString.getString());
// phoneNumbers 배열 전체 가져오기
JsonPointer jsonPointer2 = Json.createPointer("/phoneNumbers");
JsonArray array = (JsonArray) jsonPointer2.getValue(jsonStructure);
System.out.println("Phone Numbers:");
for (JsonValue value : array) {
JsonObject objValue = (JsonObject) value;
System.out.println(objValue.toString());
}
// 배열 인덱스를 이용해 두 번째 전화번호 객체 가져오기
JsonPointer jsonPointer3 = Json.createPointer("/phoneNumbers/1");
JsonObject jsonObject1 = (JsonObject) jsonPointer3.getValue(jsonStructure);
System.out.println("Home: " + jsonObject1.toString());
// 빈 문자열 포인터로 JSON 전체 구조 가져오기
JsonPointer jsonPointer4 = Json.createPointer("");
JsonObject jsonObject2 = (JsonObject) jsonPointer4.getValue(jsonStructure);
System.out.println("JSON:\n" + jsonObject2.toString());
jsonReader.close();
}
}실행 결과
First Name: Raja
Phone Numbers:
{"Mobile":"9959984000"}
{"Home":"0403758000"}
Home: {"Home":"0403758000"}
JSON:
{"firstName":"Raja","lastName":"Ramesh","age":30,"streetAddress":"Madhapur","city":"Hyderabad","state":"Telangana","phoneNumbers":[{"Mobile":"9959984000"},{"Home":"0403758000"}]}핵심 정리
위 예제에서 확인할 수 있듯이 JSON Pointer는 다양한 방식으로 활용할 수 있습니다.
1. 단일 키 접근: "/firstName"처럼 경로를 지정하면 해당 키의 값을 반환합니다.
2. 배열 요소 접근: "/phoneNumbers/1"처럼 인덱스 번호를 사용하면 배열의 특정 요소에 접근할 수 있습니다. 인덱스는 0부터 시작합니다.
3. 전체 문서 접근: 빈 문자열("")을 포인터로 사용하면 JSON 문서 전체 구조를 가져올 수 있습니다.
이처럼 JSON Pointer를 활용하면 복잡한 JSON 구조에서도 원하는 데이터를 간결하고 직관적인 경로 표현으로 쉽게 조회할 수 있습니다.